在setTimeout函数方法中使用具有更改值的变量?

时间:2012-05-17 09:04:06

标签: javascript

如果我以错误的角度来到这个街区,请告诉我。我有一系列功能,我想要启动,我希望能够将它们全部设置为循环。

for(var jj = 0; jj<monster.frames.length;jj++){
    setTimeout(
        functionName(jj),
        1000*jj
    );
}

问题在于,当functionName(jj)被执行时,它会被传递jj的值,到那时它已被更改为最后一个循环迭代值。

2 个答案:

答案 0 :(得分:13)

您需要确保内部函数为每次迭代都有一个新变量。最简单的方法是创建一个自动执行的匿名函数,该函数接收变量作为参数。您还需要修改调用函数的方式 - 现在您将functionName(jj)的返回值注册为回调函数。只有当该函数实际返回一个函数时才会这样。

for(var jj = 0; jj<monster.frames.length;jj++){
    (function(jj) {
        setTimeout(
            function() { functionName(jj); },
            1000*jj
        );
    })(jj);
}

您还可以使用部分应用程序来创建新功能。但是,旧浏览器不支持Function.prototype.bind,因此您必须为其添加垫片。

for(var jj = 0; jj<monster.frames.length; jj++){
    setTimeout(functionName.bind(this, jj), 1000*jj);
}

答案 1 :(得分:1)

放手一搏:

for(var jj = 0; jj < monster.frames.length; jj++)
{
    (function(x)
    {
        setTimeout(function()
        {
            functionName(x)
        }, 1000 * x);
    })(jj);
}