我遇到以下代码的问题:
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,但我仍然不明白为什么我的不行。