在JavaScript變量中只有函數作用域。因此,它可以是全局的,也可以是整個函數中可訪問的變量,而不管,其中(在函數內)被聲明。在循環中聲明的變量和重用的變量會發生什麼變化
我猜最好的做法是在'use strict';
之後立即在頂層聲明所有變量?
如果我有5個循環,我聲明相同的i
var會發生什麼?
for (var i = 0; i < someValue; i+=1) { ... }
該變量是否簡單地重置爲0或任何循環設置它的初始值和一切都繼續?這會導致併發症嗎?
在JavaScript變量中只有函數作用域。因此,它可以是全局的,也可以是整個函數中可訪問的變量,而不管,其中(在函數內)被聲明。在循環中聲明的變量和重用的變量會發生什麼變化
我猜最好的做法是在'use strict';
之後立即在頂層聲明所有變量?
如果我有5個循環,我聲明相同的i
var會發生什麼?
for (var i = 0; i < someValue; i+=1) { ... }
該變量是否簡單地重置爲0或任何循環設置它的初始值和一切都繼續?這會導致併發症嗎?
如您所見,i
在for
循環的開始位置設置爲0
:i = 0
。 var 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中需要選擇加入版本。
變量聲明懸掛在最上面,所以在頂部右邊聲明'var = 0'會很好,然後在每個循環'i = 0'上重新初始化該行上的變量,這樣就不會造成併發症,這是否是好的做法是另一個問題。 –
我會推薦在控制檯上玩耍併爲自己測試。 –
@JoãoGonçalves到目前爲止,我聽說過的所有關於JS的東西都告訴我,它往往會做很多微妙的事情,但並不總是顯而易見。我害怕形成壞習慣是JS比我見過的任何其他語言都要多。 – Kalec