以往Javascript的變數宣告都用「 var 」,「 var 」屬於比較鬆散的變數宣告方式,即使在不同的地方宣告一樣的變數名稱,在瀏覽器上執行一樣不會出錯,而這個特性同時也很容易造成一些Bug,ES6出現的「 let 」就很好的補足了var的不足。
回顧var的特性,var屬於function scope,意思就是在function裡面宣告的變數只有在function裡面才有用,不會影響到外面,同樣的,也不能從外頭取得function裡的變數。
結果:0
∆ 想直接取得宣告變數,結果就會是:
而function scope也代表只有在function裡面才算有自己的地盤,一旦沒有function包住var,那幾乎等於跟全域變數一樣了,會直接影響到外面宣告的變數。
結果:50
同樣包在大括號之間,但是像這樣的if statement沒有包覆住裡頭的var,連帶地影響到外面宣告的變數。
而let在一開始宣告就比var嚴謹了。
在這一步,瀏覽器會直接報錯:
而相較於function scope的var,let是block scope的,意思是在任何的{大括弧}裡面,let都會被緊緊包住,不會leak到外面去。
結果:0
在看歐萊禮的繁體中文書的時候,javascript的宣告變數scope會翻譯成「範疇」,不過如果用更白話文的方式來表達的話就是:
「只要宣告在xxx裡,就不會影響到別人」。
function scope:只要宣告在function裡,就不會影響到別人。
block scope:只要宣告在任何一個{區塊}裡,就不會影響到別人。
回顧var的特性,var屬於function scope,意思就是在function裡面宣告的變數只有在function裡面才有用,不會影響到外面,同樣的,也不能從外頭取得function裡的變數。
var i = 0; function varTest() { var i = 100; } varTest(); console.log(i);
結果:0
function varTest() { var i = 100; } varTest(); console.log(i);
∆ 想直接取得宣告變數,結果就會是:
而function scope也代表只有在function裡面才算有自己的地盤,一旦沒有function包住var,那幾乎等於跟全域變數一樣了,會直接影響到外面宣告的變數。
var i = 0; if (true) { var i = 50; } console.log(i);
結果:50
同樣包在大括號之間,但是像這樣的if statement沒有包覆住裡頭的var,連帶地影響到外面宣告的變數。
而let在一開始宣告就比var嚴謹了。
let i = 0; let i = 50;
在這一步,瀏覽器會直接報錯:
而相較於function scope的var,let是block scope的,意思是在任何的{大括弧}裡面,let都會被緊緊包住,不會leak到外面去。
let i = 0; if (true) { let i = 50; } console.log(i);
結果:0
在看歐萊禮的繁體中文書的時候,javascript的宣告變數scope會翻譯成「範疇」,不過如果用更白話文的方式來表達的話就是:
「只要宣告在xxx裡,就不會影響到別人」。
function scope:只要宣告在function裡,就不會影響到別人。
block scope:只要宣告在任何一個{區塊}裡,就不會影響到別人。