以下代码中有错误:
generate: function() {
var generated = [];
for (var j = 0; j < objectDefinitions.length; j++) {
var randomNumber;
if (!objectDefinitions[j].restrictGeneration) {
continue;
}
randomNumber = Math.random();
if (randomNumber < objectDefinitions[j].probability) {
generated.push(objectDefinitions[j].createObject());
objectDefinitions[j].restrictGeneration = true;
if (j > 5) {
}
setTimeout(function() {
//console.log(j);
objectDefinitions[j].restrictGeneration = false;
}, objectDefinitions[j].cooldown);
}
}
return generated;
}
当setTimeout“触发”时,变量j为6,这将导致数组索引超出范围异常,因为数组中只有6个项目。我不太了解发生了什么,我在setTimeout之外检查了j,它永远不会是6,但是在声明之后它似乎会改变。谢谢你的帮助。
最佳答案
它读取的变量j
是您在循环中使用的变量,因此不会被“复制”。
setTimeout(
(function(k){
return function() {
objectDefinitions[k].restrictGeneration = false;
};
}(j))
, objectDefinitions[j].cooldown);
这样,您将
j
复制到k
变量中。但是循环的每次迭代都有一个k
变量。