我从for循环变量不能在setTimeout函数中工作

时间:2017-11-30 16:58:07

标签: javascript for-loop settimeout

我遇到以下代码的问题:

    for (var i = 0; i < balls.length; i++) {
    balls[i].display();
    balls[i].move();
    for (var j = 0; j < balls.length; j++) {
        if (i != j && balls[i].collide(balls[j])) {
            if (balls[i].makeNewBall == true && balls[j].makeNewBall == true) {
                balls.push(new bold());
                balls[i].makeNewBall = false;
                balls[j].makeNewBall = false;
                console.log("if statement works!");
                setTimeout(function() {balls[i].makeNewBall = true; console.log("ball i works");},1000)
                setTimeout(function() {balls[j].makeNewBall = true; console.log("ball j works");},1000)
            }
        }
    }
}

首先,有点背景知识:

我制作了一个检查两个球之间碰撞的代码。如果两个球发生碰撞,它会向阵列添加一个新球,并将变量设置为false。该变量适用于作为一种冷却方式,因此它们不会在碰撞时连续产生新球。变量是“makeNewBall”,并且必须为新球制作。在制造新球之后,该变量变为假。之后,我创建了一个setTimeout函数,在1秒后,将此值设置为true gain。

问题:

当我使用变量“i”和“j”作为数组编号时,在两个setTimeout函数中,它显示“未捕获的TypeError:无法设置未定义的属性'makeNewBall'”。如果我代替“i”和“j”输入数值,它可以正常工作,但仅适用于具有这些数字的球明显

那么为什么我不能在setTimeout函数中使用for循环中的“i”和“j”?这两个函数与其他一些代码位于同一个for循环中,但其他代码仍然可以使用i和j。 setTimeout函数是否仍然可以访问相同的变量,因为它们位于相同的for循环中? 我读过JavaScript closure inside loops – simple practical example,但我仍然不明白为什么我的不行。

0 个答案:

没有答案