1. 程式人生 > >js學習--變量作用域

js學習--變量作用域

有意 window cti 很好 padding blog oca 菜鳥 而是

作為一名菜鳥的我,每天學點的感覺還是不錯的。今天學習閉包的過程中看到作用域與作用域鏈這兩個概念,我覺得作為一名有追求的小白,有必要詳細了解下。

變量的作用域

就js變量而言,有全局變量和局部變量。這裏我覺得這個按字面意思理解就行了.......下面舉個例子

var message = "今天我做的糯米蒸排骨"; //定義一個全局變量

function doL(){

  var ss = "俠客行很好看";      //定義一個局部變量

  alert(message);             //輸出"今天我做的糯米蒸排骨",在函數中可以引用到全局變量

  function alertDo(){

    alert(ss);

  }

  alertDo();             //輸出"俠客行很好看",這就涉及變量的作用域了

};
doL
(); alertDo(); //沒法輸出 alertDo is not defined alert(message); //可以輸出"今天我做的糯米蒸排骨"

這邊有2個很有意思的地方

1.當變量不用var聲明的時候我們實際上聲明了一個全局變量,好吧,這是錯誤的,看下面,num是一個全局變量,

mum = 1;

事實上是對屬性賦值操作。首先,它會嘗試在當前作用域鏈(如在方法中聲明,則當前作用域鏈代表全局作用域和方法局部作用域etc。。。)中解析 mum ; 如果在任何當前作用域鏈中找到mum ,則會執行對mum 屬性賦值; 如果沒有找到mum ,它才會在全局對象(即當前作用域鏈的最頂層對象,如window對象)中創造mum

屬性並賦值。

註意!它並不是聲明了一個全局變量,而是創建了一個全局對象的屬性。由於變量聲明自帶不可刪除屬性,比較var num = 1 跟 num = 1,前者是變量聲明,帶不可刪除屬性,因此無法被刪除;後者為全局變量的一個屬性,因此可以從全局變量中刪除。

var num =1;
mum = 1;

2.變量聲明會提前到函數頂部,其實之前已經遇到過了

    var scope="global";  
    function t(){  
        console.log(scope);  
        var scope="local"  
        console.log(scope);  
    }  
    t();  

它首先會輸出undefined,然後才是scope,它會將變量提前聲明並且覆蓋局部變量,等價於下面這種情況

    var scope="global";  
    function t(){  
        var scope;
        console.log(scope);  
        scope="local"  
        console.log(scope);  
    }  
    t();  

js學習--變量作用域