2016-04-25 213 views
4

我有問題。
例如我使用for循環是這樣的:For loop and hoisting

for (var i = 0; i < some_length; i++) { 
    /* some code */ 
} 

之後可變i懸掛。
這是否意味着我始終應該在範圍的開頭聲明i變量?

var i; 

for (i = 0; i < some_length; i++) { 
    /* some code */ 
} 

UPD:
我知道,這兩個循環的工作方式相同。
我的意思是哪一個更正確?

+3

兩者意味着同樣的事情,只是第一個更具可讀性。 – gurvinder372

+0

當它包裹在'function-block'中時,整個事情會變得更有意義 – Rayon

+1

「這是否意味着我總是應該在範圍的開頭聲明變量? - 這是一個意見問題。就編譯器而言,沒有區別。 – Quentin

回答

7

現代JavaScript支持block scoping通過let

for (let i = 0; i < some_length; i++) { 
    /* i is defined here */ 
} 
/* i is not defined here */

回到原來的quetion:哪個例子更正確?

我認爲第二個不太容易出錯。

+0

鏈接受密碼保護。 –

+0

修好了,謝謝! –

2

在你的例子中 - 首先是你的迭代變量的經典類型聲明。在其他情況下,例如,當您操作許多函數/對象/變量時,我建議您在範圍/對象/函數的開頭聲明所有變量。

當您在將來看到以這種方式編寫代碼時,會更容易看到這裏發生了什麼。您只需查看前10-15行代碼,並且不會搜索內部的每個變量 - 所有內容都將在代碼的開始部分進行解釋。

+1

但在FOR LOOP中更正確的是你的第一個例子。它以許多種語言隨便宣佈。 – 2016-04-25 10:57:58