我的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程序员来说似乎是一个很好的学习机会,应该找到这个问题!