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

Dog*_*Dog 2 javascript

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

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

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

Thi*_*ter 13

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

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

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

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