執行環境、做用域鏈、變量提高、this

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

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

根據這個執行環境咱們解析如下幾個問題:java

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

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

三、提高,函數提高老是優先於變量提高(爲何能夠先使用後定義)
參考:[【譯】JS的執行上下文和環境棧是什麼?]post

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

就是由於在代碼運行以前,解釋器已經掃描過在函數中變量和函數,已經建立這些變量,因此在代碼執行時,這些變量就能夠直接使用,而且函數的提高優先於變量。this

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

相關文章
相關標籤/搜索