2

JavaScript タイマーに関する質問がすでに 100 万件寄せられていることは知っていますが、これはわかりません。

#drive要素は初めて ( に0) 更新されますが、その後は更新されません。まるで動作していないか、動作setTimeout()していないかのthis.count++ようです。これが機能しない理由を知っている人はいますか?

ありがとう...

var timer = {
    timerRunning: false,
    count: 0,
    delay: 1000,

    tick: function() {
        $("#drive").html(this.count);
        this.count++;
        setTimeout(function(){
            if (this.timerRunning)
                this.tick();
        }, this.delay);
    },

    start: function() {
        this.timerRunning = true;
        this.tick();
    },

    stop: function() {
        this.timerRunning = false;
    }
};

timer.start();
4

2 に答える 2

4

thisコールバック内の値はsetTimeout()もはやタイマー オブジェクトではありません (オブジェクトになりwindowます)。それが機能していない理由です。

オブジェクトにクロージャー変数を設定し、代わりにそれを使用することで、このように修正できます。

tick: function() {
    $("#drive").html(this.count);
    this.count++;
    var self = this;
    setTimeout(function(){
        if (self.timerRunning)
            self.tick();
    }, this.delay);
},
于 2012-07-21T05:42:59.253 に答える
0

コールバックは別の this 変数にバインドされています。回避策は次のとおりです。

    tick: function() {
        var self = this;
        $("#drive").html(this.count);
        this.count++;
        setTimeout(function(){
            if (self.timerRunning)
                self.tick();
        }, this.delay);
    }
于 2012-07-21T05:49:07.477 に答える