为什么在间隔循环中定时器实例中的属性未定义?

时间:2011-12-22 14:10:37

标签: javascript javascript-events

function UITimer(interval, callbakFunction) {
    this.t = null;
    this.isRunning = 0;
    this.interval = interval;
    this.callbackFunction = callbakFunction;
};

UITimer.prototype.timeCount = function () {
    alert(this.interval);
    this.callbackFunction();
    this.t = setTimeout(this.timeCount, this.interval);
}

UITimer.prototype.startTimer = function () {
    if (!this.isRunning) {
        this.isRunning = 1;
        this.timeCount();
    }
}

UITimer.prototype.stopTimer = function () {
    clearTimeout(this.t);
    this.isRunning = 0;
}

var uiTimer = new UITimer(5000, PhotoService.GetRandomImage);
uiTimer.startTimer();

第一次this.interval = 5000,第二次undefined。我将间隔替换为常量值,但此行this.t = setTimeout(this.timeCount, 5000);无法第二次运行。有什么问题?

1 个答案:

答案 0 :(得分:3)

传递函数时this值会丢失。 foo.bar() thisfoo设置为bar内的.bind,但在存储/传递值并稍后调用时,这不会发生。

使用this强制timeCount内的this.t = setTimeout(this.timeCount.bind(this), this.interval); 值:

timeCount

或者,传递另一个调用this的函数。请注意,由于this更改了函数内部,因此您必须保存对正确的var _this = this; // won't change this.t = setTimeout(function() { _this.timeCount(); // `_this` is the correct `this` }, this.interval); 值的引用:

{{1}}