JavaScript的预编译过程

原创 Bios 教程 js 241阅读 2018-04-11 10:54:30 举报

JavaScript在运行时,要经历三步

  1. 语法分析 2.预编译 3.解析执行(自上而下)

JavaScript预编译

先思考这么一个题

预编译四部曲

  1. 创建AO对象 Activation Object(执行期上下文)
  2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
  3. 将实参值和形参统一
  4. 在函数体里面找函数声明,值赋予函数体

这四步的权重比4>3>2>1,也就是一个覆盖的过程.
函数声明在变量声明的前面

函数声明才存在变量提升。即function a(){};,而var b =function (){};不会提升。

详细分析

先看一个面试中常遇到的问题

逐行执行,在AO中是:

换一换

逐行执行,在AO中是:

按步骤分析文章开头的例子

  • 第一步
  • 第二步
  • 第三步
  • 第四步

解释执行

执行的时候:

结果:

加入window,全局环境

在全局环境中会生成一个 GO对象 (Global Object),还是按照上面的四步执行。

// 执行到 global = 100 :

当执行fn之前会先生成一个AO:

所以第一次打印globalundefined

这个时候虽然全局变量中的global已经是100,但是fn函数中自己有global变量,所以不会引用全局中的。

当执行到global = 200 :

所以第二次打印global200

最后思考一个问题

var a = b =100;
先将100赋值给b,即b=100,此时b没有声明就被赋值,在JavaScript中如果一个变量未声明就直接赋值,那么这个变量就是个全局变量。

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复