2013-04-06 46 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); 
}