js - pre-compile

ru shui 2021-09-10 Javascript
  • Javascript
  • Pre-compile
About 1 min

# js 预编译阶段的执行过程

  1. 创建 AO 对象(供 js 引擎使用)。
  2. 形参与变量声明作为 AO 对象的属性名,并初始值为 undefined。
  3. 实参与形参相统一。
  4. 找函数声明,会覆盖变量的声明。(注意函数声明与函数表达式的区别)
  5. 逐行执行。

例题:

function fn(a, c) {
  console.log(a)
  var a = 123
  console.log(a)
  console.log(c)
  function a() {}

  if (false) {
    var d = 678
  }

  console.log(d)
  console.log(b)
  var b = function () {} // 函数表达式
  console.log(b)
  function c() {}
  console.log(c)
}

fn(1, 2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  1. 创建 AO 对象。

  2. 形参与变量声明作为 AO 对象的属性名,并初始值为 undefined。

    AO = {
      a: undefined,
      c: undefined,
      a: undefined,
      d: undefined,
      b: undefined, // 函数表达式也是变量
    }
    
    1
    2
    3
    4
    5
    6
    7
  3. 实参与形参相统一。

    AO = {
      a: 1, // 实参 a = 1
      c: 2, // 实参 c = 2
      a: undefined,
      d: undefined,
      b: undefined, // 函数表达式也是变量
    }
    
    1
    2
    3
    4
    5
    6
    7
  4. 找函数声明,会覆盖变量的声明。(注意函数声明与函数表达式的区别)

    AO = {
      a: function a() {},
      c: function c() {},
      a: undefined,
      d: undefined,
      b: undefined, // 函数表达式也是变量
    }
    
    1
    2
    3
    4
    5
    6
    7
  5. 逐行执行。

    console.log(a) // [Function: a]
    var a = 123 // a = 123
    console.log(a) // 123
    console.log(c) // [Function: c]
    function a() {}
    if (false) {
      var d = 678
    }
    console.log(d) // undefined
    console.log(b) // undefined
    var b = function () {} // 函数表达式
    console.log(b) // [Function: b]
    function c() {}
    console.log(c) // [Function: c]
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
Last update: September 10, 2021 17:47
Contributors: Laishuxin