我是javascript的新手,我正在尝试使用 for 循环中的setTimeout调用函数。循环为nodeList的每个成员执行。
我发现我用setTimeout调用的函数实际上只是在循环的最后一次迭代中执行。在下面的例子中,我想对setTimeout进行三次单独的调用,但我发现前两次调用都被忽略了。
function moveants(e, stepdistance) {
. . . . .
for(var i = 0; i < 3; i++)
{
var nextAnt = antgroup.childNodes[i]
nextAnt.count = 0;
nextAnt.member = i;
setTimeout(function () { takeStep(nextAnt, mouseclickX, mouseclickY, 10) }, 0);
}
}
function takeStep(ant, destX, destY, stepDistance) {
. . . .
. . . .
if( condition )
{
return;
}
else
{
takeStep(ant, destX, destY, stepDistance);
}
}
我见过other posts描述了对setTimeout进行多次调用。令人惊讶的是(对我而言),如果我只是将它们从中取出循环,那么多个调用将会起作用。
setTimeout(function () { takeStep(antgroup.childNodes[0],
mouseclickX, mouseclickY, 10) }, 10);
setTimeout(function () { takeStep(antgroup.childNodes[1],
mouseclickX, mouseclickY, 10) }, 10);
setTimeout(function () { takeStep(antgroup.childNodes[2],
mouseclickX, mouseclickY, 10) }, 10);
我无法弄清楚为什么在 for 循环中调用它们并在一个外部调用它们之间存在差异。
我在每种情况下都从setInterval调用中获得有效的返回值..只是只有 for 循环的最后一次迭代才能实际执行该函数。
提前感谢您的帮助。
答案 0 :(得分:8)
nextAnt将在每个循环中被覆盖,因此takeStep()将被调用3次,但总是使用相同的参数。
您可以尝试这样做:
(function(a,b,c){
setTimeout(function(){
takeStep(a,b,c,10)}, 0);
})(nextAnt, mouseclickX, mouseclickY);
答案 1 :(得分:0)
如果你没有设置延迟,那么为什么还要烦扰setTimeout?
在循环中你的延迟设置为0,在你使用过的循环之外10.另外,在循环之外你已经为count和member赋值,但不在循环之外?
试试这个:
function moveants(e, stepdistance)
{
for (var i = 0; i < 3; i++)
{
setTimeout("takeStep(antgroup.childNodes[i], mouseclickX, mouseclickY, 10)", 0);
}
}
或者这个:
function moveants(e, stepdistance)
{
for (var i = 0; i < 3; i++)
{
takeStep(antgroup.childNodes[i], mouseclickX, mouseclickY, 10);
}
}