在循环中调用setTimeout函数

Mic*_*ips 3 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我看过其他帖子描述了多次调用setTimeout.令人惊讶的是(对我来说),如果我简单地将它们从这样的for循环中取出,那么多个调用将会起作用.

    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);
Run Code Online (Sandbox Code Playgroud)

我只是想不通为什么在for循环中调用它们并在一个循环之外调用它们之间存在差异.

我在每种情况下都从setInterval调用中获得有效的返回值..只是只有for循环的最后一次迭代才能实际执行该函数.

在此先感谢您的帮助.

Dr.*_*lle 8

nextAnt将在每个循环中被覆盖,因此takeStep()将被调用3次,但始终使用相同的参数.

您可以尝试这样做:

(function(a,b,c){
     setTimeout(function(){
                           takeStep(a,b,c,10)}, 0);
      })(nextAnt, mouseclickX, mouseclickY);
Run Code Online (Sandbox Code Playgroud)

  • 哦......我想我现在明白了!所以,所有三次调用setTimeout的_i_实际上仍然是for-loop迭代的整个时间.我发现这个[其他帖子](http://www.sitepoint.com/forums/javascript-15/settimeout-loop-closures-561807.html#post3900542)讨论了同样的问题.野生.奇怪的是,变量范围可以通过一层闭合而不是两层闭合.无论如何,非常酷.再次感谢! (2认同)