2016年11月29日 星期二

var、let 的scope介紹

        以往Javascript的變數宣告都用「 var 」,「 var 」屬於比較鬆散的變數宣告方式,即使在不同的地方宣告一樣的變數名稱,在瀏覽器上執行一樣不會出錯,而這個特性同時也很容易造成一些Bug,ES6出現的「 let 」就很好的補足了var的不足。

        回顧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:只要宣告在任何一個{區塊}裡,就不會影響到別人。