2

我看到将对象方法作为参数传递给 setTimeout 的问题。我知道在嵌套函数内部,需要手动设置 this 的范围,但是如果我直接传递函数对象怎么办,在我的例子中是 this.counting。将匿名函数声明为第一个参数有什么需要,this.counting 已经是一个函数。

Mozilla还在 setTimeout 第一个参数中使用 function(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();
4

1 回答 1

4

的 MDN 文档setTimeout有一整节关于它,我建议阅读它。


在您传递给的回调中setTimeoutthis将引用window,而不是您的类的实例。

如果调用该函数,this.count(它指的是window.count)将是undefined,因为没有全局count变量。后来它会变成NaNundefined++NaN)。您的对象的count属性根本不会改变。

通过将函数显式调用为对象 ( self.counting()) 的方法,您可以确保this正确引用您的类的实例。

您可以通过使用.bind [MDN]来实现相同的目的,而不是使用另一个函数:

setTimeout(this.counting.bind(this), this.start);

阅读这篇 MDN 文章以了解更多关于this.

于 2012-12-26T04:37:23.680 回答