JavaScript 對執行上下文的理解
什么是執行上下文
執行上下文是評估和執行 JavaScript 代碼的環境的抽象概念。
執行上下文類型:
- 全局執行上下文,
- 函數執行上下文,
- eval 函數執行上下文;
全局執行上下文:
任何不在函數內部的都是全局執行上下文,
它首先會創建一個全局的 window 對象,
并且設置 this 的值等于這個全局對象,
一個程序中只有一個全局執行上下文。
函數執行上下文:
當一個函數被調用時,就會為該函數創建一個新的執行上下文,函數的上下文可以有任意多個。
eval 函數執行上下文:
執行在 eval函數中的代碼會有屬于他自己的執行上下文。
執行上下文棧:
● JavaScript引擎使用執行上下文棧來管理執行上下文;
● 當JavaScript執行代碼時,首先遇到全局代碼,會創建一個全局執行上下文并且壓入執行棧中,
每當遇到一個函數調用,就會為該函數創建一個新的執行上下文并壓入棧頂,
引擎會執行位于執行上下文棧頂的函數,當函數執行完成之后,執行上下文從棧中彈出,繼續執行下一個上下文。
當所有的代碼都執行完畢之后,從棧中彈出全局執行上下文。
let a = 'Hello World!';
function first() {
console.log('Inside first function');
second();
console.log('Again inside first function');
}
function second() {
console.log('Inside second function');
}
first();
// 執行順序:
// first() 函數中的代碼先執行,然后調用 second(),second() 執行完畢后,再回到 first() 中繼續執行剩余的代碼。
創建執行上下文:
創建執行上下文有兩個階段:創建階段和執行階段。
-
創建階段:
-
this綁定:
- 在全局執行上下文中,this 指向全局對象(window 對象);
- 在函數執行上下文中,this 指向取決于函數如何調用。
如果它被一個引用對象調用,那么 this 會被設置成那個對象,
否則 this 的值被設置為全局對象或者 undefined。
-
創建詞法環境組件:
- 詞法環境:
是一種持有標識符——變量映射的數據結構,標識符是指變量/函數名,而變量是對實際對象或原始數據的引用。 - 詞法環境的內部有兩個組件:
- 環境記錄器: 用來儲存變量個函數聲明的實際位置。
- 外部環境的引用:它可以訪問其父級詞法環境(作用域)。
- 詞法環境:
-
創建變量環境組件:
變量環境也是一個詞法環境,其環境記錄器持有變量聲明語句在執行上下文中創建的綁定關系。
-
-
執行階段:
此階段會完成對變量的分配,最后執行完代碼。
簡單來說執行上下文就是指:
在執行一點JS代碼之前,需要先解析代碼。
解析的時候會先創建一個全局執行上下文環境,先把代碼中即將執行的變量、函數聲明都拿出來,變量先賦值為undefined,函數先聲明好可使用。
這一步執行完了,才開始正式的執行程序。
在一個函數執行之前,也會創建一個函數執行上下文環境,跟全局執行上下文類似,不過函數執行上下文會多出this、arguments和函數的參數。
● 全局上下文:變量定義,函數聲明;
● 函數上下文:變量定義,函數聲明,this,arguments。
關于詞法環境:
詞法環境是一種規范類型,基于 ECMAScript 代碼的詞法嵌套結構來定義標識符和具體變量和函數的關聯。
一個詞法環境由環境記錄器和一個可能的引用外部詞法環境的空值組成。

浙公網安備 33010602011771號