1. 程式人生 > >理解JavaScript的變數,變數作用域,作用域鏈

理解JavaScript的變數,變數作用域,作用域鏈

1. JavaScript的變數分為兩種

  • 全域性變數(Global variable):可以在指令碼的任何位置被引用。

  • 區域性變數(Local variable):只存在於宣告它的那個函式的內部,這個函式之外是無法引用的。

2. 關鍵字var設定了變數的作用域

  • 使用var宣告變數那麼這個變數就是區域性變數。JavaScript的全域性變數是全域性物件的屬性。
    當使用var宣告一個變數時,這個變數時無法通過delete運算子刪除的。如:
    var m =1;   //t是一個不可刪除的全域性變數
    n = 2;  //建立全域性物件的一個可刪除的屬性
    this.t = 3
; //建立全域性物件的一個可刪除的屬性 delete m//false:變數沒有被刪除 delete n//true:變數被刪除了 delete this.t //true:變數被刪除了
  • 沒有使用var就是一個全域性變數。 如:
   function square(num){ 
        global = num * num; //global是一個全域性變數
        return global;
    }
    var local = 50; //local是一個區域性變數
    var number = square(20); //number是一個區域性變數
alert(global); //結果:400

3.執行環境(execution context)

每個執行環境都有一個與之關聯的變數物件,環境中定義的所有的變數和函式都儲存在這個變數物件中。

4. 作用域鏈(scope chain)

JavaScript中每個函式都有一個執行環境,當代碼在一個環境中執行時,就會建立變數物件的作用域鏈。
  • 作用域鏈用途:保證對執行環境有權訪問的變數和函式的有序訪問。

  • 如果這個環境是函式,則將其活動物件作為變數物件。

  • 作用域鏈的前端,始終都是當期那執行環境的程式碼所在的變數物件。作用域鏈中的下一個變數物件來自包含(外部)環境,而在再下一個變數物件則是來自下一個包含環境,這樣一直延續到全域性執行環境。

  • 全域性執行環境的變數物件始終都是作用域鏈中的最後一個物件。

5. 作用域鏈組成

在JavaScript的最頂層程式碼,也就是不包含在任何函式定義內的程式碼,作用域鏈由一個全域性物件組成。

  • 在不包含巢狀的函式體內,作用域鏈上有兩個物件:(1)定義函式引數和區域性變數物件。 (2)全域性物件。

  • 在一個巢狀的函式體內,作用域鏈上至少有三個物件。

6. 理解作用域鏈

當定義一個函式時,它實際上儲存一個作用域鏈,當呼叫這個函式時,它建立一個新的物件來儲存它的區域性變數,並將這個物件新增到儲存它的作用域鏈上。

7. 作用域鏈訪問

內部環境可以通過作用域鏈訪問所在的外部環境,但是外部環境不能訪問內部環境的任何變數和函式。

例如:

    var color1 = "blue";
    function changeColor(){
        var color2 = "red";
        function swapColor(){ 
        var temp = color2;
        color2 = color1;
        color1 = temp;
        //這裡可以訪問color1,color2,temp 
        //(即swapColor這個函式作用域內)
    }
    //這裡可以訪問color1,color2,但是不能訪問temp 
    //(即在changeColor這個大函式的作用域內)
    swapColor();
    }
    //這裡只能訪問color1 (即全域性作用域)
    changeColor();