《用得上的前端知识》系列 - 你我都很忙,能用100字说清楚,绝不写万字长文
基本概念
- 执行上下文:可以理解为当前代码的执行环境,包含代码执行过程中所需的信息;可用以追踪或还原代码的执行情况。
- 执行上下文栈:是一个后进先出的数据结构(LIFO),用来跟踪和管理执行上下文;
- 词法环境(有 2 层意思)
- LexicalEnvironment / Lexical Environment
-
- LexicalEnvironment,词法环境对象;
- Lexical Environment,词法环境,一种规范类型。
执行上下文的结构
执行上下文由以下 3 个组件构成:
- 词法环境组件,用于记录其他声明的绑定(如let、const、class等);
- 变量环境组件,用于记录var声明的绑定;
- this 绑定组件,指定该执行环境内的 ECMA 脚本代码中 this 关键字所关联的值。
注:
词法环境组件、变量环境组件均为词法环境对象,执行上下文创建时,它们均指向同一个词法环境对象。该对象由以下部分组成:
- 环境记录项;
-
- 声明式环境记录项,提供可变绑定、不可变绑定;
- 对象式环境记录项,只提供可变绑定。
- 外部词法环境引用。
执行上下文的类型
JS种的“可执行代码”主要有以下类型:
- 全局代码;
- 函数代码;
- eval函数代码;
因此,对应的执行上下文类型有以下几种:
- 全局执行上下文
-
- 只有一个,程序首次运行时创建,它会在浏览器中创建一个全局对象(window对象),使this指向这个全局对象。
- 函数执行上下文
-
- 函数被调用时创建,每次调用都会为该函数创建一个新的执行上下文。
- eval函数执行上下文
-
- 运行 eval 函数中的代码时创建的执行上下文,少用且不建议使用。
执行上下文的创建
- JavaScript引擎是按可执行代码块来执行代码的;
- 每当从当前执行代码运行至其他可执行代码时,会创建新的执行上下文,将其压入执行上下文栈并成为正在运行的执行上下文;
- 当相关代码执行完毕返回后,将正在运行的执行上下文从执行上下文栈删除,之前的执行上下文又成为了正在运行的执行上下文。
参考资料
- github.com/logan70/Blo…
- www.w3.org/html/ig/zh/… – ES5 中文文档
- 262.ecma-international.org/5.1/ – ES5 英文文档
- 262.ecma-international.org/6.0/#sec-le… – ES6 英文文档
- www.qiwenke.com/2017/03/24/…