这段代码很好用:
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。"这是为什么?
答案 0 :(得分:4)
由于this
调用它的方式,您在函数中失去了setInterval()
的正确值。
将您的代码更改为:
setInterval(s.recall.bind(s),1000);
当您将s.recall
传递给setInterval()
时,它只会传递一个函数引用,s
在recall
被setInterval()
调用时不会传入}。任何函数引用都是如此。
如果你这样做了:
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。