温顾而知新:JS编译执行流程

98 阅读1分钟

js编译执行流程

js引擎编译执行的过程可以分为三个阶段:词法语法分析预编译解释执行

词法语法分析

js引擎扫描代码检测是否有低级的语法错误,并生成AST

预编译

预编译简单理解就是在内存中开辟一些空间,用来存放执行时所需的变量与函数(包括变量提升,函数提升,静态作用域确定),创建代码执行时所需的执行上下文环境

全局预编译

全局预编译执行三部曲:生成全局执行上下文

  • 创建Global Object(简称为GO)
  • 变量提升:找形参和变量声明,将变量声明和形参作为GO的属性,值为undefined
  • 函数提升:在全局里找函数声明,将函数名作为GO的属性名,值赋予函数体

函数预编译

函数预编译执行四部曲:生成函数执行上下文

  • 创建Activation Object(简称为AO)
  • 变量提升:找形参和变量声明,将变量声明和形参作为AO的属性名,值为undefined
  • 将实参和形参值统一
  • 函数提升:在函数体里找函数声明,将函数名作为AO对象的属性名,值赋予函数体

解释执行

执行阶段主要使用js的事件循环机制来实现,会把创建的执行上下文放到执行栈去执行,函数执行上下文执行完毕后就会被销毁,释放内存。