js预编译

118 阅读1分钟

js预编译

预编译是上下文创建之后,js代码执行前的一段时期,在这个时期,会对js代码进行预处理

全局预编译

全局上下文创建后,会生成变量对象VO,VO首先寻找变量声明,将var声明的变量作为VO对象的属性名,值为undefined。然后寻找函数声明,属性值为函数本身,如果函数名与变量名冲突,函数声明会将变量声明覆盖

console.log(a)
    var a = 100
    function a() {}
    console.log(a)

输出结果展示

 funA
 100

函数预编译

函数上下文创建后,会生成变量对象AO

  • 寻找变量声明,变量名为AO对象的属性名,属性值为undefined
  • 寻找形参,形参名作为AO对象的属性名,属性值置为undefined
  • 将实参的值赋予形参,及替换AO对象中形参的属性值
  • 寻找函数声明,函数名为AO对象的属性名,属性值为函数本身
  • 如果函数名与变量名冲突,函数名会将变量声明覆盖 例如
function a(b,c) {
      console.log(b)
      var b = 0
      console.log(b)
      var b = function() {
        console.log('bbbb')
      }
      console.log(c)
      console.log(b)
    }
    a(1)

输出结果

{
      1
      0
      undefined
      funB
    }

面试案例:

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)

输出结果:

{
      funA
      123
      funC
      undefined
      undefined
      funB
      funC
    }