2013-04-06 44 views
0

我正在尝试使一些函数依次工作,并在它们之间等待1.5秒。不能通过setTimeout调用函数

现在,当我尝试用相同的ID这样做(里面的 “NoteList(>这里<)”,如1,2,3,或任何其他它的工作原理;

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

} 

BUT!当我尝试用var这样做我,它不工作,并得到了所有的功能卡的页面。任何想法,为什么?

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

     } 

回答

1

这是因为所有的功能指的是同一livei变量,而不是变量的值在你叫setTimeout()的时间。这意味着超时实际运行时,您的功能i将为36

试试这个:

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

这在每次循环执行一个匿名函数,每次执行取得自己x参数在原有功能的使用。

+0

谢谢,成功了! – user2122746 2013-04-06 12:06:58

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