重溫javascript--執行環境和作用域鏈

執行環境和作用域鏈這個問題理解了以後,會更好的理解閉包等問題。

執行環境 (exection context)

執行環境,關於這個詞語,有許多的解釋,但是個人認爲下面的解釋更好的理解。執行環境定義了變量或函數有權力訪問的其他數據,決定了它們各自的行爲。
每一個執行環境,都有一個與之關聯的變量對象。環境中定義的所有的變量和函數都保存在這個對象中。
如圖所示:
這裏寫圖片描述
執行環境可以分爲兩類,一類是全局環境,另外一類是局部環境。

var a=1;//執行環境是 window對象(最外面的執行環境)
function changeNum(){//每個函數都有一個執行環境(variable obj)
    var b=3;
    function swapNum(){//又產生了一個新的執行環境
        var c=b;
        b=a;
        a=c;
    }
    swapNum();
}
changeNum();

在一個頁面中。當第一次加載Js文件創建的一個全局執行環境,即最外面的執行環境。在瀏覽器中,被認爲是window對象,因此所有的全局變量和函數都是作爲window對象的屬性和方法來創建的。
而當調用了一個函數時則會進入相應的執行環境,如果再調用其他函數則會進入新的一個執行環境,直到函數執行返回以後回到最初的執行環境。

作用域鏈 (Scope chain)

看着代碼來認識作用域鏈是比較好的方法。例如:

var a=1;// 作用域1
function changeNum(){//作用域2
    var b=3;
    function swapNum(){//作用域3
        var c=b;
        b=a;
        a=c;            //這裏可以訪問到 1 2 3
    }
    swapNum();          //這裏可以訪問到 1 2
}
changeNum();            //這裏只能訪問到1

當代碼在一個環境中執行時,都會創建基於Variable Object的一個作用域鏈。作用域鏈的用途是保證對執行環境有權訪問的所有變量和函數的有序訪問。整個作用域鏈是由不同執行位置上的Variable Object按照規則所構建一個鏈表。作用域鏈的最前端,始終是當前正在執行的代碼所在環境的Variable Object。

如上圖所示:如果當前執行的是函數swapNum,則它處於作用域鏈的最前端,下一個就是包含它的環境(function changeNum),而再下一個就是全局執行環境了。全局執行環境始終是作用域鏈的最後一個對象。

所以在作用域3中時,可以現在3中找到c,但是找不到b和a,就可以向上一級追溯到作用域2中,可以找到b了,但是依舊找不到a,最後在全局執行環境中找到了a,這樣搜索就結束了。這就是作用域鏈的概念。

在垃圾回收機制和塊級作用域的博客裏,曾經提到js沒有塊級作用域,準備了這兩個知識,就爲了接下來的閉包打好了一定的基礎。

一起努力吧,小夥伴們!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章