1. 程式人生 > 其它 >預編譯 - js函式高階

預編譯 - js函式高階

JS執行機制

  • 語法分析

  • 預編譯

  • 解釋執行

預編譯

  • 函式宣告整體提升

  • 變數宣告變數名提升

預編譯前奏

  • 如果變數未宣告就賦值,此變數為全域性物件所有

var a = b = 123 //在區域性作用域中宣告

此時b為全域性變數

  • 一切宣告的全域性變數,全為window的屬性

預編譯開始

  • 建立AO物件

  • 形參變數宣告,將形參名變數作為AO屬性名,值為undefined

  • 將實參值和形參統一

  • 在函式體裡面找函式宣告,值賦予函式體

function fn(a) {
  console.log(a)

  var a = 123
  console.log(a)

  function a() {}
  console.log(a)

  var b = function() {}
  console.log(b)

  function d() {}
}
fn(1)
  1. 建立AO物件(Activation Object)[執行期上下文]

AO {}

  1. 處理AO物件,設定AO的key
AO {
  a: undefined,
  b: undefined
}
  1. 引數統一
AO {
  a: 1,
  b: undefined
}
  1. 函式宣告處理
AO {
  a: function a() {},
  b: undefined,
  d: function d() {},
}

預編譯發生在函式執行前一刻

  1. 執行函式
  • 處理賦值,將變數值賦值給相關的變數名
列印輸出:

function a() {}

123

123

function () {}

Go (Global Object) 就是window,同時GO的預編譯和AO一樣