在瞭解js的執行上下文對象與執行上下文棧之前,我們要先了解兩個概念 即變量提升跟函數提升
變量提升 : 通過var定義的變量,在定義語句之前我們就可以直接訪問到,不過它的值是undefined
函數提升: 通過function定義的函數,在函數定義語句前,我們就可以直接調用
變量提升與函數提升都是js引擎的預處理產生的 ,先是變量提升,然後纔是函數提升.
執行上下文對象
全局執行上下文: ( 確定執行上下文對象==>預處理==>執行代碼 )
1. 在執行全局代碼前將window確定爲全局執行上下文對象
2. 對全局數據進行預處理:
對變量進行提升,值設置爲undefined.並添加爲window對象的屬性
對函數進行提升並賦值.添加爲window對象的方法
將this賦值爲window;
3. 最後開始執行全局代碼
函數執行上下分: ( 調用函數==>創建函數執行上下文對象==>預處理==>執行函數體 )
1. 在調用函數,準備執行函數體代碼之前,創建對應的函數執行上下文對象 (虛擬的,存於棧中)
2. 對局部數據進行預處理:
把實參賦值給形參,添加爲該執行上下文對象的屬性
變量提升
函數提升
把this賦值給調用該函數的對象
3. 開始執行函數體代碼
執行上下文棧 : (爲了方便管理,js隱藏會創建一個棧來統一管理執行上下文對象)
1.在全局代碼執行前,js引擎創建一個棧,用於管理所有的執行上下文對象
2. 全局執行上下文對象(window)確定後,將其放入到棧中
3. 調用函數時,會創建一個此函數的執行上下文對象,並放到棧中
4. 函數執行完,js引擎會將其對應的執行上下文對象從棧中移除
5. 所有的代碼執行完後,棧中只剩window