一尘不染

setTimeout和JavaScript中的“ this”

javascript

我有一个使用该setTimeout函数并调用另一个方法的方法。在初始加载时,方法2可以正常工作。但是,超时后,我得到一个错误,它method2是未定义的。我在这里做错了什么?

例如:

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, 5000);
};

test.prototype.method2 = function(name) {
    for (var i = 0; i < document.images.length; i++) {
        if (document.images[i].id.indexOf(name) > 1) {
            return document.images[i];
        }
    }
};

阅读 259

收藏
2020-04-25

共1个答案

一尘不染

问题是setTimeout()导致javascript使用全局范围。本质上,您是在调用method()类,而不是从中调用this。相反,您只是在告诉setTimeout您使用method没有特定作用域的函数。

要解决此问题,您可以将函数调用包装在另一个引用正确变量的函数调用中。它看起来像这样:

test.protoype.method = function()
{
    var that = this;

    //method2 returns image based on the id passed
    this.method2('useSomeElement').src = "http://www.some.url";

    var callMethod = function()
    {
        that.method();
    }

    timeDelay = window.setTimeout(callMethod, 5000);
};

that可能是this因为callMethod()在方法的范围内。

当您需要将参数传递给setTimeout方法时,此问题会变得更加复杂,因为IE不支持向传递两个以上的参数setTimeout。在这种情况下,您需要阅读闭包。

另外,作为旁注,由于method()总是调用,因此您将自己设置为无限循环method()

2020-04-25