js编译执行流程
js引擎编译执行的过程可以分为三个阶段:词法语法分析,预编译,解释执行
词法语法分析
js引擎扫描代码检测是否有低级的语法错误,并生成AST
预编译
预编译简单理解就是在内存中开辟一些空间,用来存放执行时所需的变量与函数(包括变量提升,函数提升,静态作用域确定),创建代码执行时所需的执行上下文环境
全局预编译
全局预编译执行三部曲:生成全局执行上下文
- 创建Global Object(简称为GO)
- 变量提升:找形参和变量声明,将变量声明和形参作为GO的属性,值为undefined
- 函数提升:在全局里找函数声明,将函数名作为GO的属性名,值赋予函数体
函数预编译
函数预编译执行四部曲:生成函数执行上下文
- 创建Activation Object(简称为AO)
- 变量提升:找形参和变量声明,将变量声明和形参作为AO的属性名,值为undefined
- 将实参和形参值统一
- 函数提升:在函数体里找函数声明,将函数名作为AO对象的属性名,值赋予函数体
解释执行
执行阶段主要使用js的事件循环机制来实现,会把创建的执行上下文放到执行栈去执行,函数执行上下文执行完毕后就会被销毁,释放内存。