JavaScript预编译
JS运行三部曲:
- 语法分析
- 预编译
- 解释执行
预编译什么时候发生?:
作用域的创建阶段就是预编译阶段
- 全局预编译
- 局部预编译
全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻。
tip:预编译阶段找到变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译 。只有在解释执行阶段才会进行变量初始化 。
预编译做了什么?
全局预编译的三个步骤
- 创建GO对象(Global Object)全局对象。
- 找变量声明,将变量名作为GO属性名,值为undefined
- 查找函数声明,作为GO属性,值赋予函数体
tip:GO对象是全局预编译,所以它优先于AO对象所创建和执行
局部预编译的四个步骤
- 创建ao对象,即JS的变量对象。供js引擎进行访问
- 找到形参与变量的声明,将变量和形参名作为AO属性名,值为undefined
- 实参和形参相统一
- 找函数声明,如果和变量声明相同则覆盖。


参考及引用:
https://zhuanlan.zhihu.com/p/50236805
你不知道的JavaScript
从本文引申出另一个思考:let在编译中的过程以及TDZ(暂时性死区)的含义

浙公网安备 33010602011771号