0

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

现在,当我尝试使用相同的 ID 这样做时(在“NoteList(>here<)”中,如 1、2、3 或任何其他,它可以工作;

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);

        }
4

2 回答 2

1

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

试试这个:

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

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

于 2013-04-06T12:02:22.677 回答
1

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);
}
于 2013-04-06T12:04:43.967 回答