2016-01-21 79 views
4

我想在setTimeout的參數函數使用不同值(取決於循環索引)作爲參數的循環內設置多個超時。這是一個simplificated例如:在使用setTimeout時將值傳遞給javascript中的函數

for(i=0; i<5; i++) 
{ 
    var m = setTimeout(function() {console.log(i)}, (i+1)*2000); 
} 

我認爲與上面的代碼我得到 「0,1,2,3,4」 每2秒。取而代之的是,我每2秒鐘就會得到「5,5,5,5」。爲什麼?

回答

3

如果你感到快樂限制到現代Web瀏覽器的支持(即不IE 9和更早版本)以下將工作:

for(i=0; i<5; i++) 
{ 
    var m = setTimeout(function (i) {console.log(i)}, (i+1)*2000, i); 
} 

你可以通過你的變量作爲第三個參數的setTimeout,然後接收它在你的setTimeout函數中。

至於爲什麼你的原始代碼不起作用,它必須做這是相當不錯這裏解釋的Javascript範圍:What is lexical scope?

1

你需要一個包裝函數來創建一個封閉和保持i值在迭代時間:

for(i=0; i<5; i++) { 
    (function(timeout) { 
     var m = setTimeout(function() {console.log(timeout)}, (timeout+1)*2000); 
    })(i)   
} 
相關問題