1. 程式人生 > >js作用域鏈的理解

js作用域鏈的理解

(18.12.26)

js作用域鏈的理解

一,執行環境

執行環境定義了變數和函式有權訪問的其他資料。每個執行環境都有與之對應的變數物件(variable object),儲存著該環境中定義的所有變數和函式。

1.1全域性環境

全域性執行環境是最外圍的一個執行環境,在web瀏覽器中,我們可以認為他是window物件,因此所有的全域性變數和函式都是作為window物件的屬性和方法建立的。程式碼載入瀏覽器時,全域性環境被建立,關閉網頁或者關閉瀏覽時全域性環境被銷燬。

1.2函式執行環境

每個函式都有自己的執行環境,當執行流進入一個函式時,函式的環境就被推入一個環境棧中,當函式執行完畢後,棧將其環境彈出,把控制權返回給之前的執行環境。

二,作用域與作用域鏈

2.1全域性作用域和區域性作用域

var name1 = "Tom";
function fn() {
    var name2 = "Jack";
    console.log(name1); //Tom
    console.log(name2); //Jack
}
fn();
console.log(name1); //Tom
console.log(name2); //ReferenceError: name2 is not defined

以上就是name1在全域性作用域所以可以在任何地方訪問,name2在區域性作用域,僅可以在函式中訪問。

2.2作用域鏈

全域性作用域和區域性作用域中變數的訪問許可權,其實是由作用域鏈決定的。
每進入一個新的執行環境就會新建一個用於搜尋函式和屬性的作用域鏈,作用域鏈是函式被建立時的作用域物件集合。作用域鏈可以保證對執行環境有權訪問的屬性和函式有序訪問。

var name1 = "Tom";
function outter() {
    var name2 = "outter-Jack";
    function inner() {
        console.log(name1); //Tom
        console.log(name2); //outter-Jack
        var T = name1;
        name1 = name2;
        name2 = T;
        console.log(name1); //outter-Jack
        console.log(name2); //Tom
    }
    inner();
    console.log(name1); //outter-Jack
    console.log(name2); //Tom
}
outter();
console.log(name1); //outter-Jack

outter的作用域鏈包括二個物件:自己的變數物件----》全域性的變數物件
inner的作用域包括三個物件: 自己的變數物件-----》outter()區域性環境的變數物件-----》全域性環境的變數物件。

當前作用域可以修改上一級作用域的變數資料。
如inner()內name1與name2互換。