首页  >  文章  >  web前端  >  异步使用 setTimeout 时如何保留 JavaScript 中“this”的上下文?

异步使用 setTimeout 时如何保留 JavaScript 中“this”的上下文?

Patricia Arquette
Patricia Arquette原创
2024-10-24 18:25:19913浏览

How to Preserve the Context of

setTimeout 和 JavaScript 中难以捉摸的“this”

在 JavaScript 中使用 setTimeout 函数时,遇到的一个常见问题是“this”关键字。当包含 setTimeout 调用的方法引用另一个方法,但在超时期限之后,引用的方法变得未定义时,就会出现这种情况。

此问题源于 setTimeout 的操作方式。当函数作为参数传递给 setTimeout 时,该函数内“this”的上下文就会丢失。这是因为 setTimeout 会异步执行该函数,到那时,“this”的原始上下文可能无法再访问。

要解决此问题,有两种常见的解决方案:

1.使用bind()方法

bind()方法可用于在传递给setTimeout的函数中保留“this”的上下文。通过将“.bind(this)”附加到函数末尾,可以显式保留上下文,如以下示例所示:

setTimeout(function() {
    this.foo();
}.bind(this), 1000);

2.箭头函数

箭头函数自动将“this”绑定到周围的上下文。因此,不需要额外的步骤来维护传递给 setTimeout 的回调函数中的正确上下文:

setTimeout(() => {
    this.foo();
}, 1000);

将这些技术应用于提供的代码片段,可以通过修改代码来解决问题,如下所示:

test.prototype.method = function() {
    //method2 returns image based on the id passed
    this.method2('useSomeElement').src = "http://www.some.url";
    timeDelay = window.setTimeout(this.method.bind(this), 5000);
    //                                       ^^^^^^^^^^^ <- fix context
};

以上是异步使用 setTimeout 时如何保留 JavaScript 中“this”的上下文?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn