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);
}

简洁明了的代码;在创建变量实例后的每一秒,它应该将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 回答