JS複習 -- 作用域鏈

作用域鏈屬於執行上下文的屬性之一。

咦?你問我執行上下文是什麼:
當JS代碼執行一段可執行代碼的時候,就會創建對應的可執行上下文。每個執行上下文都有三個重要屬性:
1、變量對象
2、作用域鏈(後面我們就會了解,作用域鏈其實就是變量對象組成的鏈)
3、this

好了,言歸正傳了。

當js執行過程中,需要查找一個變量的時候,會先從當前上下文的變量對象中查找。但是如果沒找到,就會從詞法層面上(一定注意這裏是詞法)的父級執行上下文變量中查找,一直找到全局爲止。

這個!就是這個啦,由多個執行上下文的變量對象構成的鏈表就叫做作用域鏈。說白了就是查找對象的時候依次訪問的的那個變量對象的鏈。

函數創建

JS採用的是詞法作用域而非動態作用域,也就是說,函數的作用域在函數定義的時候決定,而不是在運行的時候決定。

JS的函數有一個內部屬性[[scope]],當創建函數的時候,這個屬性就會保存所有父級的變量對象(VO)到其中。此時,[[scope]] 還並不是完整的作用域鏈。

函數激活

當函數被激活,也就是代碼執行過程中進入了函數上下文,此時會創建變量對象(在進入上下文的時候也稱活動對象),然後將這個活動對象添加到作用域鏈的前面。

Scope = [AO].concat([[Scope]]);

至此,作用域鏈纔算是創建完畢。

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