2010-07-03 156 views
4

我有幾個關於JavaScript的for循環的問題。JavaScript的for循環意外行爲

第一個問題:

for (i=0; i<=2; i++) {;} 
console.log(i); 

輸出爲3。它不應該是2?

第二個問題:

for (var i=0; i<=2; i++) { 
    setTimeout(function(){console.log(i);}, i*1000); 
} 

超時是否正確設置:0,1000和2000,但輸出是3,3,3(應爲0,1,2)。這是否意味着環路退出後執行延遲功能?爲什麼?

我應該看明白這一切的神祕JavaScript的東西嗎?

謝謝。

+0

+1我也在找) – naiad 2010-07-03 06:51:54

回答

9

第一個問題:

沒有因爲i變量上次成功迭代後遞增,則條件檢查和評估爲false如此循環結束。

for語句組成:

for ([initialExpression]; [condition]; [incrementExpression]) 
    statement 

而且它執行下面的步驟:

  1. initialExpression在開始評估
  2. condition進行評估,如果評估爲false,循環結束,如果評估結果爲true,則評估該語句。
  3. 評估聲明。
  4. incrementExpression評估,轉到步驟2

第二個問題:

如你所知的功能是異步執行後的循環已經結束,在這個時候i包含3

這種情況的常見解決方法是使用一個函數來保存在每次迭代的循環變量的值,例如:

for (var i=0; i<=2; i++) { 
    (function (i) { 
    setTimeout(function(){console.log(i);}, i*1000); 
    })(i); 
}