JavaScript预编译

JS运行三部曲

  1. 语法分析
  2. 预编译
  3. 解释执行

预编译什么时候发生?
作用域的创建阶段就是预编译阶段

  • 全局预编译
  • 局部预编译

全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻。

tip:预编译阶段找到变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译 。只有在解释执行阶段才会进行变量初始化 。

预编译做了什么?

全局预编译的三个步骤

  1. 创建GO对象(Global Object)全局对象。
  2. 找变量声明,将变量名作为GO属性名,值为undefined
  3. 查找函数声明,作为GO属性,值赋予函数体

tip:GO对象是全局预编译,所以它优先于AO对象所创建和执行

局部预编译的四个步骤

  1. 创建ao对象,即JS的变量对象。供js引擎进行访问
  2. 找到形参与变量的声明,将变量和形参名作为AO属性名,值为undefined
  3. 实参和形参相统一
  4. 找函数声明,如果和变量声明相同则覆盖。

image
image

参考及引用:
https://zhuanlan.zhihu.com/p/50236805
你不知道的JavaScript

从本文引申出另一个思考:let在编译中的过程以及TDZ(暂时性死区)的含义

posted @ 2021-05-31 16:33  strive、x  阅读(76)  评论(0)    收藏  举报