0

我想用JavaScript顯示正在進行的編號。使用windows.setTimeout時丟失參數

爲此,我開發了下面的例子:

for(var i=0; i<100; i++) { 
    window.setTimeout(function() { 
    alert(i); 
    },1000*i); 
} 

不幸的是,100號顯示每次。我認爲這是因爲i是一個參考?

這怎麼能改變參數傳遞?

+1

因此,您實際上在每次測試代碼時都點擊100個警報框? – Amberlamps 2013-02-11 12:07:17

+0

[Javascript閉包內循環 - 簡單實用示例]的可能重複(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – 2013-02-11 12:22:45

回答

1

問題是JS不會在超時過期之前等待並繼續完成循環。屆時,i已經是100.

要解決此問題,您的超時應該有一個本地參考i。這樣,它並沒有引用當時已經爲100的i,而是在循環的當時引用i

for(var i=0; i<100; i++) { 
    (function(i){ 
    //shadowing the loop-i with the function-i 
    window.setTimeout(function() { 
     //thus, this callback is referencing the i from the function 
     //and not the loop's i 
     alert(i); 
    },1000*i); 
    }(i)); 
}