【问题标题】:Can't call a function through setTimeout无法通过 setTimeout 调用函数
【发布时间】:2013-04-06 11:59:53
【问题描述】:

我正在尝试让一些功能一个接一个地工作,它们之间的等待时间为 1.5 秒。

现在,当我尝试使用相同的 ID 执行此操作时(在“NoteList(>here

for (var i = 0; i < 36; i++)
{
    setTimeout(function () { OnClcRandom(NoteList[0]) }, i * 1000 + 1000);

}

但是!当我尝试使用 var i 这样做时,它不起作用并且使页面中的所有功能都卡住了。知道为什么吗?

   for (var i = 0; i < 36; i++)
        {
            setTimeout(function () { OnClcRandom(NoteList[i]) }, i * 1000 + 1000);

        }

【问题讨论】:

    标签: javascript jquery asp.net function var


    【解决方案1】:

    那是因为所有函数都引用同一个 live i 变量,而不是您调用 setTimeout() 时的变量值。这意味着到超时实际运行您的函数时i 将是36

    试试这个:

        for (var i = 0; i < 36; i++) {
            (function(x){
               setTimeout(function () { OnClcRandom(NoteList[x]) }, i * 1000 + 1000);
            )(i);
        }
    

    这会在循环的每次迭代中执行一个匿名函数,每次执行都会获得自己的 x 参数以用于您的原始函数。

    【讨论】:

      【解决方案2】:

      Javascript 不会为块创建本地范围。 :)

      在您的第二个示例中,var i 等于 36(最后一个值)。 您需要在循环内创建本地范围。

      for (var i = 0; i < 36; i++) {
      
       (function (i) {
         setTimeout(.......);
      }(i))
      
      }
      

      您也可以将 'i' 值固定分配给函数属性:

      for (var i = 0, f; i < 36; i++){
        f = function _callback() { var i = _callback.i; .....};
        f.i = i;
        setTimeout(f, i * 1000);
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-14
        • 2022-09-27
        • 2017-02-21
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        • 1970-01-01
        相关资源
        最近更新 更多