在循环中调用setTimeout函数

时间:2011-05-13 02:12:56

标签: javascript for-loop settimeout

我是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 循环的最后一次迭代才能实际执行该函数。

提前感谢您的帮助。

2 个答案:

答案 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);
    }
}