我发现将对象方法作为参数传递给setTimeout时出现问题。 我知道嵌套函数内部,这个需要手动设置,但如果我直接传递函数对象,在我的情况下是this.counting。将匿名函数声明为第一个参数的需要是什么,this.counting已经是一个函数。
Mozilla也在setTimeout第一个参数中使用函数(msg){self.remind(msg);}而不是this.remind。
function Timer(count,start){
this.count = count;
this.start = start;
}
//below code works
Timer.prototype.counting = function(){
var self = this;
setTimeout(function(){self.counting();},this.start);
console.log(this.count);
this.count++;
};
//below code doesn't work
/*
Timer.prototype.counting = function(){
setTimeout(this.counting,this.start);
console.log(this.count);
this.count++;
};
*/
var t1 = new Timer(0,1000);
t1.counting();
var t2 = new Timer(100,1000);
t2.counting();
答案 0 :(得分:4)
The MDN documentation of setTimeout
has a whole section about it,我建议您阅读。
在传递给setTimeout
的回调中,this
将引用window
,而不是您班级的实例。
如果调用该函数,this.count
(引用window.count
)将为undefined
,因为没有全局count
变量。稍后它会变为NaN
(undefined++
为NaN
)。对象的count
属性根本不会改变。
通过显式调用函数作为对象的方法(self.counting()
),可以确保this
正确引用类的实例。
您可以使用.bind
[MDN]来实现相同目的,而不是使用其他功能:
setTimeout(this.counting.bind(this), this.start);
阅读this MDN article,详细了解this
。