javascript - setinterval导致对象忘记属性?

时间:2016-05-01 23:13:34

标签: javascript properties setinterval

这段代码很好用:

function whatever() {
    var s = new a('ayy');
    s.recall();
}

function a(word) {
    this.word = word;
    this.recall = function () {
        alert(this.word);
    }
}

浏览器会通过ayy提醒用户。但是,为什么,这样做呢:

function whatever() {
    var s = new a('ayy');
    setInterval(s.recall,1000);
}

function a(word) {
    this.word = word;
    this.recall = function () {
        alert(this.word);
    }
}

但在这种情况下,警报" undefined"每秒钟出现而不是" ayy。"这是为什么?

1 个答案:

答案 0 :(得分:4)

由于this调用它的方式,您在函数中失去了setInterval()的正确值。

将您的代码更改为:

setInterval(s.recall.bind(s),1000);

当您将s.recall传递给setInterval()时,它只会传递一个函数引用,srecallsetInterval()调用时不会传入}。任何函数引用都是如此。

如果你这样做了:

var f = s.recall;
f();

你会看到同样的问题。使用.bind()是一种解决办法,可确保将该函数调用为s.recall(),从而保留s的值,从而保留this的值recall {1}}方法。

函数内this的值取决于它的调用方式。对于具有this正确值的方法,必须调用obj.method()或类似.bind().call().apply()之类的方法。为了控制this的值。 setInterval()没有做到这些。它只是进行正常的函数调用,因此this将设置为全局或undefined(取决于您是否处于严格模式)。

有关如何在Javascript函数中控制this的值的详细信息,请参阅Controlling the Value of this in a function