# js运行流程

js引擎处理js的过程同传统编译语言的代码编译大致相同

# 流程

步骤 传统编译语言 JS引擎
1 词法/语法分析 词/语法分析
2 解析生成AST 解析生成AST
3 代码生成 预编译
4 执行 执行

# 预编译阶段

js代码是运行时编译(编译发生在代码执行前几微秒),即预编译完立即执行。预编译阶段进行初始化执行上下文

  • 声明提升

    • 初始化上下文时有变量声明,先去作用域链查找是否已存在,无则创建属性并赋值undefined,有则不作处理
    • 初始化上下文时有函数声明,先去作用域链查找是否已存在,无则创建属性并赋值函数,有则覆盖
  function a(b) {
    console.log(b) 
    function b() {
      console.log(b)
    }
    b()
  }
  a(2)
1
2
3
4
5
6
7
8
  • let、const阻止提升的原因
    • 预编译时,存在TDZ暂时性死区
    • 遇到let,const声明变量放入TDZ中
    • 访问变量时,若存在TDZ中,则报错
    • 执行声明后,从TDZ中移除
var a =1
function fun() {    
      console.log(a)
      let a =1 
}    
console.log(a)
fun()
1
2
3
4
5
6
7

# LHS与RHS查找类型

  • LHS a = 1
  • RHS console.log(a)
  console.log(a)

  b = 1
1
2
3
最后更新时间: 8/22/2019, 3:13:38 PM