1. 程式人生 > 其它 >JS進階 十一——執行上下文

JS進階 十一——執行上下文

技術標籤:Javascriptjsjavascript執行上下文面試題執行上下文棧

1.程式碼分類

  • 全域性程式碼
  • 函式(區域性)程式碼

2.全域性執行上下文

  • 在執行全域性程式碼前將window確定為全域性執行上下文
  • 對全域性資料進行預處理
    • var定義的全域性變數==>undefined, 新增為window的屬性
    • function宣告的全域性函式==>賦值(fun), 新增為window的方法
    • this==>賦值(window)
  • 開始執行全域性程式碼

在這裡插入圖片描述

3.函式執行上下文

  • 在呼叫函式, 準備執行函式體之前, 建立對應的函式執行上下文物件(虛擬的, 存在於棧中)
  • 對區域性資料進行預處理
    • 形參變數==>賦值(實參)==>新增為執行上下文的屬性
    • arguments==>賦值(實參列表), 新增為執行上下文的屬性
    • var定義的區域性變數==>undefined, 新增為執行上下文的屬性
    • function宣告的函式 ==>賦值(fun), 新增為執行上下文的方法
    • this==>賦值(呼叫函式的物件)
  • 開始執行函式體程式碼

4.執行上下文棧

  1. 在全域性程式碼執行前, JS引擎就會建立一個棧來儲存管理所有的執行上下文物件
  2. 在全域性執行上下文(window)確定後, 將其新增到棧中(壓棧)
  3. 在函式執行上下文建立後, 將其新增到棧中(壓棧)
  4. 在當前函式執行完後,將棧頂的物件移除(出棧)
  5. 當所有的程式碼執行完後, 棧中只剩下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