2015-09-04 61 views
3

在JavaScript變量中只有函數作用域。因此,它可以是全局的,也可以是整個函數中可訪問的變量,而不管,其中(在函數內)被聲明。在循環中聲明的變量和重用的變量會發生什麼變化

我猜最好的做法是在'use strict';之後立即在頂層聲明所有變量?

如果我有5個循環,我聲明相同的i var會發生什麼?

for (var i = 0; i < someValue; i+=1) { ... } 

該變量是否簡單地重置爲0或任何循環設置它的初始值和一切都繼續?這會導致併發症嗎?

+1

變量聲明懸掛在最上面,所以在頂部右邊聲明'var = 0'會很好,然後在每個循環'i = 0'上重新初始化該行上的變量,這樣就不會造成併發症,這是否是好的做法是另一個問題。 –

+1

我會推薦在控制檯上玩耍併爲自己測試。 –

+1

@JoãoGonçalves到目前爲止,我聽說過的所有關於JS的東西都告訴我,它往往會做很多微妙的事情,但並不總是顯而易見。我害怕形成壞習慣是JS比我見過的任何其他語言都要多。 – Kalec

回答

2

如您所見,ifor循環的開始位置設置爲0i = 0var i部分被懸掛到該函數的頂部,並且每增加一個var i …重新聲明i,並且i = 0部分重新定義了它。重新聲明是不必要的,並且使得代碼不那麼幹淨(JSHint就此提醒你)。

如果您以後使用i,在任何循環之外,則將i設置爲for循環對它所做的任何操作。

for(var i = 0; i < 4; i++){ 
    /* 
    As the last few steps i is incremented (i == 4), 
    then it is checked with (i < 4), which is false; the loop is done. 
    */ 
    //… 
} 
i; // 4 

因爲你通常重新定義循環的頭每一個迭代變量,這會不會導致任何其他問題。

然而,更清晰的代碼明智的做法是使用一個變量每循環,或使let變量,而不是var變量,let變量的作用域只有for循環塊:

for(let i = 0; i < 20; i++){ 
    // … 
} 

for(let i = 0; i < 10; i++){ // This is fine. 
    // … 
} 

let變量僅在符合ECMAScript-6的瀏覽器中可用,並且在Firefox中需要選擇加入版本。