执行上下文

146 阅读2分钟

《用得上的前端知识》系列 - 你我都很忙,能用100字说清楚,绝不写万字长文

基本概念

  • 执行上下文:可以理解为当前代码的执行环境,包含代码执行过程中所需的信息;可用以追踪或还原代码的执行情况。
  • 执行上下文栈:是一个后进先出的数据结构(LIFO),用来跟踪和管理执行上下文;
  • 词法环境(有 2 层意思)
    • 一种用于定义特定变量和函数标识符在 ECMAScript 代码的词法嵌套结构上关联关系的规范类型
    • 词法环境对象,由:环境记录(Environment Record)和对外部词法环境的引用(outer)组成。
  • LexicalEnvironment / Lexical Environment
    • LexicalEnvironment,词法环境对象;
    • Lexical Environment,词法环境,一种规范类型。

执行上下文的结构

执行上下文由以下 3 个组件构成:

  • 词法环境组件,用于记录其他声明的绑定(如let、const、class等);
  • 变量环境组件,用于记录var声明的绑定;
  • this 绑定组件,指定该执行环境内的 ECMA 脚本代码中 this 关键字所关联的值。

注:

词法环境组件、变量环境组件均为词法环境对象,执行上下文创建时,它们均指向同一个词法环境对象。该对象由以下部分组成:

  • 环境记录项;
    • 声明式环境记录项,提供可变绑定、不可变绑定;
    • 对象式环境记录项,只提供可变绑定。
  • 外部词法环境引用。

执行上下文的类型

JS种的“可执行代码”主要有以下类型:

  • 全局代码;
  • 函数代码;
  • eval函数代码;

因此,对应的执行上下文类型有以下几种:

  • 全局执行上下文
    • 只有一个,程序首次运行时创建,它会在浏览器中创建一个全局对象(window对象),使this指向这个全局对象。
  • 函数执行上下文
    • 函数被调用时创建,每次调用都会为该函数创建一个新的执行上下文。
  • eval函数执行上下文
    • 运行 eval 函数中的代码时创建的执行上下文,少用且不建议使用。

执行上下文的创建

  • JavaScript引擎是按可执行代码块来执行代码的;
  • 每当从当前执行代码运行至其他可执行代码时,会创建新的执行上下文,将其压入执行上下文栈并成为正在运行的执行上下文;
  • 当相关代码执行完毕返回后,将正在运行的执行上下文从执行上下文栈删除,之前的执行上下文又成为了正在运行的执行上下文。

参考资料