JS進階 十一——執行上下文
阿新 • • 發佈:2021-02-16
技術標籤:Javascriptjsjavascript執行上下文面試題執行上下文棧
1.程式碼分類
- 全域性程式碼
- 函式(區域性)程式碼
2.全域性執行上下文
- 在執行全域性程式碼前將window確定為全域性執行上下文
- 對全域性資料進行預處理
- var定義的全域性變數==>undefined, 新增為window的屬性
- function宣告的全域性函式==>賦值(fun), 新增為window的方法
- this==>賦值(window)
- 開始執行全域性程式碼
3.函式執行上下文
- 在呼叫函式, 準備執行函式體之前, 建立對應的函式執行上下文物件(虛擬的, 存在於棧中)
- 對區域性資料進行預處理
- 形參變數==>賦值(實參)==>新增為執行上下文的屬性
- arguments==>賦值(實參列表), 新增為執行上下文的屬性
- var定義的區域性變數==>undefined, 新增為執行上下文的屬性
- function宣告的函式 ==>賦值(fun), 新增為執行上下文的方法
- this==>賦值(呼叫函式的物件)
- 開始執行函式體程式碼
4.執行上下文棧
- 在全域性程式碼執行前, JS引擎就會建立一個棧來儲存管理所有的執行上下文物件
- 在全域性執行上下文(window)確定後, 將其新增到棧中(壓棧)
- 在函式執行上下文建立後, 將其新增到棧中(壓棧)
- 在當前函式執行完後,將棧頂的物件移除(出棧)
- 當所有的程式碼執行完後, 棧中只剩下window
1. 依次輸出什麼?
2.整個過程中產生了幾個執行上下文?
console.log('gb: '+ i)
var i = 1
foo(1)
function foo(i) {
if (i == 4) {
return
}
console.log('fb:' + i)
foo(i + 1) //遞迴呼叫: 在函式內部呼叫自己
console.log('fe:' + i)
}
console.log('ge: ' + i)
-->
gb: undefined
fb: 1
fb: 2
fb: 3
fe: 3
fe: 2
fe: 1
ge: 1
-->5