我的JavaScript代码中的索引越界错误

我的JavaScript代码中的索引越界错误,javascript,arrays,object,closures,settimeout,Javascript,Arrays,Object,Closures,Settimeout,以下代码中存在错误: generate: function() { var generated = []; for (var j = 0; j < objectDefinitions.length; j++) { var randomNumber; if (!objectDefinitions[j].restrictGeneration) { continue; } randomNu

以下代码中存在错误:

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;
}
generate:function(){
生成的var=[];
对于(var j=0;j5){
}
setTimeout(函数(){
//控制台日志(j);
objectDefinitions[j]。restrictGeneration=false;
},objectDefinitions[j].冷却时间);
}
}
产生的回报;
}

当setTimeout“激发”变量j时,它会导致数组索引越界异常,因为数组中只有6项。我真的不明白发生了什么,我在setTimeout外检查了j,它从来都不是6,但在声明之后它似乎改变了。感谢您的帮助。

它读取的变量
j
是您在循环中使用的变量,因此它没有被“复制”


这样,将
j
复制到
k
变量中。但是循环的每次迭代都有一个
k
变量。

它读取的变量
j
是您在循环中使用的变量,因此它没有被“复制”


这样,将
j
复制到
k
变量中。但是循环的每次迭代都有一个
k
变量。

执行空if语句(不执行任何操作),然后它移动到set timeout,j仍然大于5


基本上,您应该在该点退出,而不是继续在if语句之后执行更多代码,或者在那里执行else语句,以便在j>5时不再执行其他代码。

如果执行空if语句(不执行任何操作),那么它将移到set timeout,j仍然大于5

基本上,您应该在该点退出,而不是继续在if语句之后执行更多代码,或者在那里执行else语句,以便在j>5时不再执行其他代码。

这是由于闭包

您看到的值是
6
,因为
j++
最后一次运行时触发for循环的退出。因此,该闭包现在的
j
为6。当执行
setTimeout
时(在
for
循环完成之后),它将在该闭包的上下文中执行

您需要将此代码移动到它自己的闭包中,这是通过将其移动到它自己的函数中来完成的。类似于:

generate: function() {
    var generated = [];
    for (var j = 0; j < objectDefinitions.length; j++)
    {
       handleIteration(generated, j); // Re-factor your code into a new function
    }

    return generated;
}
generate:function(){
生成的var=[];
对于(var j=0;j
这是由于关闭

您看到的值是
6
,因为
j++
最后一次运行时触发for循环的退出。因此,该闭包现在的
j
值为6。当
setTimeout
执行时(在
for
循环完成之后),它将在该闭包的上下文中执行

您需要将此代码移动到它自己的闭包中,这是通过将其移动到它自己的函数中来完成的。类似于:

generate: function() {
    var generated = [];
    for (var j = 0; j < objectDefinitions.length; j++)
    {
       handleIteration(generated, j); // Re-factor your code into a new function
    }

    return generated;
}
generate:function(){
生成的var=[];
对于(var j=0;j
谢谢你的回复,不幸的是,j在那一点上从来没有超过5。这是奇怪的事情。谢谢你的回复,不幸的是,j在那一点上从来没有超过5。这是奇怪的事情。非常感谢,我需要仔细考虑一下,但是代码工作得很好。非常感谢,我需要仔细考虑一下,但是代码工作得很好。是的,我确实这么认为可能与作用域/闭包有关,但由于某种原因,我对发生的事情感到非常困惑,我(错误地)我认为j会被复制而不是引用。我通过使用xavierm02描述的匿名函数解决了这个问题,使用单独的函数可能会更优雅,尽管如此,谢谢。是的,我确实认为这可能与作用域/闭包有关,但由于某种原因,我对发生的事情感到非常困惑,我(错误地)我认为j会被复制而不是引用。我通过使用xavierm02所描述的匿名函数解决了这个问题,使用单独的函数可能会更优雅,尽管如此,谢谢你。我想知道这个问题是否有更好的标题,因为这对于新手js程序员来说似乎是一个很好的学习机会,这个问题应该是我想知道这个问题是否有更好的标题,因为这对于新手js程序员来说似乎是一个很好的学习机会,应该找到这个问题!