🍓 運行環境
JavaScript 中,有三種代碼運行環境:
- Global 環境
- Function 環境
- Eval 環境
爲了表示不同的運行環境,JavaScript 中有一個執行環境的概念。
🍑 執行環境
執行環境都有三個重要的屬性:
- 變量對象
- 作用域鏈
- this
這三個屬性跟代碼運行的行爲有很重要的關係,在之前的文章中都有詳細分析。具體可以查看《JS 總結之函數、作用域鏈》、《JS 總結之變量對象》和《JS 總結之關於 this 應該知道的幾個點》。
當一段 JavaScript 代碼執行的時候,JavaScript 解釋器會創建執行環境,其實這裏會有兩個階段:
- 創建階段(當函數被調用,但是開始執行函數內部代碼之前)
- 創建 Scope chain
- 創建 VO / AO(variables, functions and arguments)
- 設置 this 的值
- 激活/代碼執行階段
- 設置變量的值、函數的引用,然後解釋/執行代碼
整個執行過程可以參考《JS 總結之閉包》中舉的例子。
🍒 執行環境棧
當 JavaScript 代碼執行的時候,會進入不同的執行環境,這些執行環境會構成一個執行環境棧。在開始解析代碼的時候,會將全局執行環境 globalContext 壓入執行環境棧中:
執行環境棧 = [globalContext]
現在寫個例子:
var a = 1
function d() {}
function b() {
function c() {
d()
}
c()
}
b()
那麼對應的執行環境棧爲:
執行環境棧 = [
dContext
cContext,
bContext,
globalContext
]
當每個執行環境執行完後,執行環境棧會將它往外丟,最後只剩下 globalContext。globalContext 直到應用程序退出(如關閉網頁或瀏覽器)時纔會摧毀。。
🚀 參考
- JavaScript 的執行上下文 by 田小計劃
- JavaScript 深入之執行上下文棧 by 冴羽