執行環境、作用域鏈、變量提升、this

重點:每一個函數都有自己的執行環境,每個執行環境都有一個與之關聯的變量對象,環境中定義的變量和函數都保存在這個對象中。
這個對象就是執行上下文對象:

executionContextObj={
    //變量對象
    variableObject:{/*函數中的arguments對象,參數、內部的變量以及函數聲明*/]
    //作用域
    scopeChain:{/*variableObject以及所有父執行上下文中的variableObject*/},
    this:{}
}

根據這個執行環境我們解析以下幾個問題:

1、查找變量的順序(知識點:作用域與作用域鏈)
executionContextObj中的scopeChain是這個函數的作用域,scopeChain=variableObject+[[scope]]
varibaleObject爲當前的變量對象,[[scope]]爲父執行上下文的作用域鏈,variableObject位於前面,所以查找變量時總是先從自身查找,然後依次到父執行上下文中查找。
即當在函數中查找一個變量時,是根據作用域查找的。

2、this是什麼?和作用域的區別
this總是指向函數調用時的環境(動態作用域即運行時上下文)
作用域保存的是函數被定義時的環境(靜態作用域即編程時的上下文)
我們知道javascript沒有塊級作用域,最小單位爲函數,作用域能訪問到函數中的變量,this則指向調用者,即可訪問對象中的變量

3、提升,函數提升總是優先於變量提升(爲什麼可以先使用後定義)
參考:[【譯】JS的執行上下文和環境棧是什麼?]

在調用函數時,但是在執行裏面的代碼之前,會對函數進行一次掃描,解釋器通過掃描傳入的參數或參數的函數、本地函數聲明和局部函數聲明來創建executionContextObj。此掃描的結果將稱爲executionContextObj中的variableObject。

就是因爲在代碼運行之前,解釋器已經掃描過在函數中變量和函數,已經創建這些變量,所以在代碼執行時,這些變量就可以直接使用,並且函數的提升優先於變量。

借鑑文章:【譯】JS的執行上下文和環境棧是什麼?https://juejin.im/post/5c8554...

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