Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 添加时返回为NaN的整数_Javascript_Timer_Setinterval_Nan - Fatal编程技术网

Javascript 添加时返回为NaN的整数

Javascript 添加时返回为NaN的整数,javascript,timer,setinterval,nan,Javascript,Timer,Setinterval,Nan,在编写一些代码时,当创建一个类的实例时,一个整数变量发生了一些奇怪的事情: 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++; con

在编写一些代码时,当创建一个类的实例时,一个整数变量发生了一些奇怪的事情:

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)


这是为什么?有没有我没有看到的解决方案?

内部的
设置超时
代码与外部的不一样(更多信息),因此您的代码实际上是在计算
未定义的++
,即
NaN

您必须创建另一个变量,并将函数传递给setTimeout,而不是让它计算字符串(顺便说一句,传递函数应该更快,而且看起来更好):


我知道这是一个5年前的问题,但它是2018年的问题,这里有一个Es6语法解决方案,以避免绑定关键字
this
的额外步骤

this.spawnTimer = setInterval(() => {
    this.bornTime++; 
    console.log(this.bornTime);
}, 1000);

查看下面我的答案,了解es6 arrow函数的用法,它在javascript中解决了这个问题,并避免了额外的代码行。:)
this.spawnTimer = setInterval(() => {
    this.bornTime++; 
    console.log(this.bornTime);
}, 1000);