3

いくつかのコードを書き、クラスのインスタンスを作成するときに、私が持っている整数変数で奇妙なことが起こります:

function Mat(x, y, spawner) {
    this.x = x;
    this.y = y;
    this.val = 1;
    this._spawner = spawner;
    this.newborn = true;
    this.bornTime = 0;
    this.spawnTimer = setInterval("this.bornTime++; console.log(this.bornTime);", 1000);
}

きれいにカットされた明確なコード。変数のインスタンスが作成された後、1 秒ごとに、bornTime変数を 1 ずつ増やしてログに記録する必要があります。

Mat.prototype.update = function() {
    if (this.bornTime >= 5) {
        this.bornTime = null;
        clearInterval(this.spawnTimer);
        this.newborn = false;
        console.log("Grown!");
    }
}

この追加コードにより、このインスタンスは 5 秒後に「成長」しますが、コンソールを確認すると、bornTimeが数値 (NaN) ではないことがわかります。

これはなぜですか?また、私が見ていない解決策はありますか?

4

2 に答える 2

3

thisコードの内側はsetTimeout外側と同じではないため ( MDNの詳細情報)、コードは実際に を計算undefined++しています。これはNaNです。

別の変数を作成し、文字列を評価させる代わりに setTimeout に関数を渡す必要があります (ちなみに、関数を渡す方が高速で、見栄えも良いはずです)。

var that = this;
this.spawnTimer = setInterval(function(){
    that.bornTime++; 
    console.log(that.bornTime);
}, 1000);
于 2013-08-16T22:36:27.123 に答える
3

私はこれが5年前の質問であることを知っていますが、その2018年であり、キーワードをバインドする余分なステップを避けるためのEs6構文ソリューションthisです。

this.spawnTimer = setInterval(() => {
    this.bornTime++; 
    console.log(this.bornTime);
}, 1000);
于 2018-09-24T14:53:21.163 に答える