【问题标题】:Using a variable with changing value in setTimeout function approach?在 setTimeout 函数方法中使用具有变化值的变量?
【发布时间】:2012-05-24 20:23:24
【问题描述】:

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

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

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

【问题讨论】:

标签: javascript


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    试一试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      相关资源
      最近更新 更多