【问题标题】:How can I create multiple setInterval()s dynamically? [duplicate]如何动态创建多个 setInterval()? [复制]
【发布时间】:2015-01-23 20:24:11
【问题描述】:

我有一个脚本需要一个函数为每个对象运行多次,但对象的数量由用户在变量中设置。

它会像这样工作

dothis(1);
dothis(2);
dothis(3);

但这不起作用

for (var i = 0; i < howMany; i++)
{
    setInterval(
        function()
        {
            dothis(i);
        },
        (Math.floor(Math.random() * 10) + 1)
    );
}

【问题讨论】:

  • 这不起作用,为什么?请发布日志或错误输出
  • 如果您只想:dothis(1); dothis(2); ... 为什么需要setInterval() 带有循环?为什么只有一个循环或一个间隔不起作用?
  • @SpencerWieczorek 每个间隔应该在不同(随机)时间运行和完成

标签: javascript for-loop setinterval


【解决方案1】:

您需要在本地范围内对 i 的值进行快照,否则它会在执行时动态“重新生成”,这意味着该值将始终为 howMany,因为 CPU 锁由 main 函数创建, 阻止您的 setInterval/setTimeout 函数在循环结束之前执行。

for (var i = 0; i < howMany; i++)
{
    setInterval(
        function(j)
        {
            return function() { dothis(j); };
        }(i),
        (Math.floor(Math.random() * 10) + 1)
    );
}

请参阅How do JavaScript closures work? 以获取更多参考。

【讨论】:

  • 谢谢。所以我想这与声明另一个接受一个值的函数,然后用该值调用dothis(),然后调用newfunction(i),然后调用dothis() 的值i 是一样的?跨度>
  • 否,因为i 的范围仍将比newfunction 高1 级(因此仍在动态评估中)。在我的示例中使用 j 参数的目的是使其 local 因此完全静态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多