无法通过setTimeout调用函数

时间:2013-04-06 11:59:53

标签: javascript jquery asp.net function var

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

现在,当我尝试使用相同的Id(在“NoteList(> here<)”内部,如1,2,3或任何其他ID)时,它可以正常工作;

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

}

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

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

        }

2 个答案:

答案 0 :(得分: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参数,以便在原始函数中使用。

答案 1 :(得分: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);
}