执行上下文

114 阅读2分钟

定义

  • 执行上下文(Execution context 简称 EC)就是一个评估和执行JavaScript代码的环境的抽象概念。 Javascript 代码都是在执行上下文中运行。
  • 执行上下文一共由三种
    • 全局执行上下文ECG(Execution context Global
    • 函数执行上下文EC(Execution context
    • eval函数执行上下文

生命周期

  • 创建阶段
    • 创建词法环境组件
      • 创建环境记录器
      • 创建外部环境引用(全局执行上下文为null)
    • 创建变量环境组件
    • this绑定 根据this的四种绑定规则
  • 执行阶段
    • 完成变量分配 执行代码
  • 垃圾回收
    • 弹出执行上下文 等待虚拟机垃圾回收

执行上下文栈ECS (ECS Execution context stack)

  • 执行上下文由执行上下文栈ECS管理

执行过程

解析阶段

  • 创建ECG,将ECG压入ECS

    • 创建全局执行上下文词法环境,词法环境是一种由标识符-变量映射的一种数据结构,内部由环境记录器外部环境引用组成 标识符是变量名 (变量就是值的实际位置 环境记录器用来存储变量,函数等 外部环境引用可以访问上一层作用域)
    • 创建全局执行上下文变量环境,变量环境是一种特殊的词法环境,主要用于es6的var声明的变量存储
    • this绑定
  • 遇到函数调用,创建函数执行上下文EC,压入ECS栈顶

    • 创建函数执行上下文词法环境
    • 创建函数执行上下文变量环境
    • this绑定

执行阶段

  • js引擎会执行位于ECS栈顶的执行上下文对应的函数 进行变量赋值 执行函数里的代码
  • 执行完毕之后会将该函数执行上下文弹出ECS栈,继续执行下一个执行上下文
  • 全部代码执行完毕之后弹出ECG,等待虚拟机垃圾回收

执行上下文与作用域的区别

执行上下文是执行代码的前一刻生成的 所以this的指向是不确定的,作用域是解析阶段就完成的,this定义的时候就已经确定