在setTimeout中传递this.method不起作用?

时间:2012-12-26 04:32:10

标签: javascript

我发现将对象方法作为参数传递给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();

1 个答案:

答案 0 :(得分:4)

The MDN documentation of setTimeout has a whole section about it,我建议您阅读。


在传递给setTimeout的回调中,this将引用window,而不是您班级的实例。

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

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

您可以使用.bind [MDN]来实现相同目的,而不是使用其他功能:

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

阅读this MDN article,详细了解this