如果我以错误的角度来到这个街区,请告诉我。我有一系列功能,我想要启动,我希望能够将它们全部设置为循环。
for(var jj = 0; jj<monster.frames.length;jj++){
setTimeout(
functionName(jj),
1000*jj
);
}
问题在于,当functionName(jj)
被执行时,它会被传递jj
的值,到那时它已被更改为最后一个循环迭代值。
答案 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);
}