定义
执行上下文时是代码执行时的环境,JS代码在运行前进行编译,那么会生成两部分,一部分是可执行的代码,而另一部分则是执行上下文。
作用
用于跟踪代码运行的运行情况。执行步骤如下:
- 一段代码块对应一个执行上下文,被封装成函数的代码被视作一段代码块,或者“全局作用域”也被视作一段代码块。
- 当程序运行,进入到某段代码块时,一个新的执行上下文被创建,并被放入执行栈中。当程序运行到这段代码块结尾后,对应的执行上下文被弹出栈。
- 当程序在某段代码块中运行到某个点需要转到了另一个代码块时(调用了另一个函数),那么当前的可执行上下文的状态会被置为挂起,然后生成一个新的可执行上下文放入执行栈的顶部。
- 执行栈最顶部的可执行上下文被称为 running execution context。当顶部的可执行上下文被弹出后,上一个挂起的可执行上下文继续执行。
类别
全局执行上下文、函数执行上下文和 eval 执行上下文
发展
执行上下文所包含的内容是在不断的变化的。它主要分为了三个不同的阶段。分别是ES3阶段,ES5阶段和ES9阶段
ES3阶段
- variable object:变量对象,用于存储变量的对象。
- scope:作用域,也常常被叫做作用域链。
- this
ES5阶段
- variable environment:变量环境, 当声明变量时使用。(此环境还包含了一个外部引用,用来指向外部的执行上下文,我们把这个外部引用称为 outer(外部环境))
- lexical environment:词法环境, 当获取变量时使用。
- this
ES9阶段
正常情况
正常情况会有如下四种
- variable environment:变量环境,当声明变量时使用。
- lexical environment:词法环境,当获取变量或者 this 值时使用。
- code evaluation state:用于恢复代码执行位置。
- Realm:使用的基础库和内置对象实例。
⚠️:this 值被归入 lexical environment
特定情况
在特定的情况下又会有如下三种
- Function:执行的任务是函数时使用,表示正在被执行的函数。
- ScriptOrModule:执行的任务是脚本或者模块时使用,表示正在被执行的代码。
- Generator:仅生成器上下文有这个属性,表示当前生成器
参考
TC39规范:https://tc39.es/ecma262/#sec-type
https://segmentfault.com/a/1190000009522006
浏览器原理与实践
重学前端