【知识点】JS预编译与作用域链

627 阅读1分钟

js运行三部曲:

  1. 语法检测(通篇扫描,查看是否有语法错误)
  2. 词法分析(预编译)
  3. 解释执行

全局预编译过程

  1. 创建GO(window)对象(Global Object -- 全局执行期上下文)
  2. 找变量的声明,将形参和变量名作为AO属性名,值为undefined
  3. 找函数声明,值赋予函数体。
  4. 注:如果遇到同名的变量会覆盖

函数预编译过程(预编译发生在函数执行之前)

  1. 创建AO对象(Activation Object -- 函数执行期上下文)
  2. 找形参和变量的声明,将形参和变量名作为AO属性名,值为undefined
  3. 将实参值和形参统一。
  4. 在函数体里面找函数声明,值赋予函数体。
  5. 注:如果遇到同名的变量会覆盖

当函数执行前会创建AO对象,函数执行完成后会销毁AO对象。

作用域链:每个AO对象串联起来的链,最后为GO对象