以下代码中有错误:

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变量。

07-25 21:36