2011-12-22 5 views
1
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);は2回目を実行できませんでした。何が問題ですか?インターバルループ中にタイマインスタンスにプロパティが定義されていないのはなぜですか?

答えて

3

thisの値は、関数を渡すと失われます。 foo.bar()は〜foobarに設定しますが、値を格納/渡して後で呼び出すときは、このようなことはありません。

使用.bindtimeCount内部this値を強制する:

this.t = setTimeout(this.timeCount.bind(this), this.interval); 

をまたは、timeCountを呼び出す別の関数を渡します。しかし、thisが関数内で変更されているので、正しい値への参照を保存する必要があります。

関連する問題