JavaScript预编译

JavaScript预编译四部曲:

  1. 创建AO(Activation Object)对象;
  2. 找形参和变量申明,将变量和形参名作为AO对象的属性名,值为undefined
  3. 将实参值和形参值相统一;
  4. 在函数体里面找函数申明,值赋予函数体。

这样说比较难理解,我们来看个例子:

    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)

第一步,创建AO对象:

AO:  {}

第二步,找形参和变量申明,将变量和形参名作为AO对象的属性名,值为undefined:

image.png

根据上图可得AO对象为:

AO: {
  a: undefined,
  b: undefined
}

第三部,将实参值和形参值相统一
例子中函数只有a一个形参,AO对象为

AO: {
  a: 1,
  b: undefined
}

第四部,在函数体里面找函数申明,值赋予函数体。
例子中函数申明如下图:

image.png

如果函数申明的函数名和AO对象的属性名相同,那么会覆盖掉的AO原来的属性值
AO对象的a属性重复了,从而被覆盖。故生成的AO对象为:

AO: {
 a: function a () {}, //这里a被覆盖了
 b: undefined,
 d: function d () {}
}

最后来看运行结果:

    function fn (a) {
      // AO: { a: function a () {} }
      console.log(a) // function a () {}
      var a = 123  // 这里将AO的值改变成123 AO: {a: 123} 
      console.log(a) // 123
      function a () {}
      console.log(a) // 123
      var b = function () {} 
      console.log(b) // function () {}
      function d () {}
    }

    fn(1)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • js运行三部曲 语法分析 预编译 解释执行 预编译前奏 imply global 暗示全局变量, 即任何变量, 如...
    刘翾阅读 3,576评论 0 1
  • 大家要明白,这个预编译和传统的编译是不一样的(可以理解js预编译为特殊的编译过程)JavaScript是解释型语言...
    pengtoxen阅读 2,271评论 0 0
  • 老样子,先看下面的函数 function fn(a){ console.log(a) var a = 123 co...
    esbook阅读 825评论 0 0
  • 预编译前奏 变量声明提升通过var定义(声明)的变量,在定义语句之前就可以访问到值:undefined 函数声明提...
    Lnevan阅读 1,410评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,723评论 28 53