定义
- 执行上下文(
Execution context简称EC)就是一个评估和执行JavaScript代码的环境的抽象概念。Javascript代码都是在执行上下文中运行。 - 执行上下文一共由三种
- 全局执行上下文ECG(
Execution context Global) - 函数执行上下文EC(
Execution context) - eval函数执行上下文
- 全局执行上下文ECG(
生命周期
- 创建阶段
- 创建词法环境组件
- 创建环境记录器
- 创建外部环境引用(全局执行上下文为null)
- 创建变量环境组件
- this绑定 根据this的四种绑定规则
- 创建词法环境组件
- 执行阶段
- 完成变量分配 执行代码
- 垃圾回收
- 弹出执行上下文 等待虚拟机垃圾回收
执行上下文栈ECS (ECS Execution context stack)
- 执行上下文由执行上下文栈ECS管理
执行过程
解析阶段
-
创建ECG,将ECG压入ECS
- 创建全局执行上下文词法环境,词法环境是一种由
标识符-变量映射的一种数据结构,内部由环境记录器和外部环境引用组成 标识符是变量名 (变量就是值的实际位置 环境记录器用来存储变量,函数等 外部环境引用可以访问上一层作用域) - 创建全局执行上下文变量环境,变量环境是一种特殊的词法环境,主要用于es6的var声明的变量存储
- this绑定
- 创建全局执行上下文词法环境,词法环境是一种由
-
遇到函数调用,创建函数执行上下文EC,压入ECS栈顶
- 创建函数执行上下文词法环境
- 创建函数执行上下文变量环境
- this绑定
执行阶段
- js引擎会执行位于ECS栈顶的执行上下文对应的函数 进行变量赋值 执行函数里的代码
- 执行完毕之后会将该函数执行上下文弹出ECS栈,继续执行下一个执行上下文
- 全部代码执行完毕之后弹出ECG,等待虚拟机垃圾回收
执行上下文与作用域的区别
执行上下文是执行代码的前一刻生成的 所以this的指向是不确定的,作用域是解析阶段就完成的,this定义的时候就已经确定