JavaScript 的执行上下文

发布于:2025-07-16 ⋅ 阅读:(15) ⋅ 点赞:(0)

当 JS 引擎处理一段脚本内容的时候,它是以怎样的顺序解析和执行的?脚本中的那些变量是何时被定义的?它们之间错综复杂的访问关系又是怎样创建和链接的?要解释这些问题,就必须了解 JS 执行上下文的概念。
JavaScript引擎: JavaScript引擎是一个计算机程序,它接收JavaScript源代码并将其编译成CPU可以理解的二进制指令(机器码)。JavaScript引擎通常是由浏览器供应商开发的,每一个主流浏览器都有一个自己开发的引擎。如:谷歌Chrome浏览器的V8引擎,Firefox的SpiderMonkey和IE的Chakra。

所有JavaScript代码都需要在某种环境中托管运行。在大多数情况下,网络浏览器就是这个环境。浏览器的JavaScript引擎会创造一个特殊的环境来处理这些JavaScript代码的转换和执行。

执行上下文的基本概念

执行上下文(Execution Context) 是 ECMAScript 规范中用于管理代码执行环境的抽象机制,定义了变量、函数和 this 值的作用域规则。

每个执行上下文由以下三个核心组件构成:词法环境(Lexical Environment)、变量环境(Variable Environment)和 This 绑定(ThisBinding)。

词法环境:(Lexical Environment) 词法环境是一种规范类型,用于根据 ECMAScript 代码的词法嵌套结构,将标识符与特定变量和函数关联起来。简单地理解,词法环境用于存储变量和函数的标识符绑定,即变量名与值的映射关系。其包含两个部分,分别是环境记录器和外部环境的引用。环境记录(Environment Record)用于实际存储变量名和值的映射(如 let a = 1 会记录为 a → 1),是具体存储变量和函数定义的对象。外部引用(Outer Reference)是指向外层词法环境的指针,用于形成作用域链。

变量环境(Variable Environment): 变量环境是一种词法环境,其环境记录保存由 VariableStatements(即 var 声明)创建的绑定。在 ES6 之后,变量环境是词法环境的一种特例,两者通常指向同一对象,但规范中仍保留区分以兼容旧代码。

This 绑定(ThisBinding): this 绑定是一个值,用作当前执行上下文代码的接收者。this 值在运行时根据函数调用方式确定(如全局调用、方法调用、构造函数调用等)。

ECMA-262 第 10 版(2024)

  • “An execution context is a specification device that is used to track the runtime evaluation of code by an ECMAScript implementation.”(执行上下文是一种规范机制,用于跟踪 ECMAScript 实现对代码的运行时评估。)
  • “A Lexical Environment is a specification type used to define the association of Identifiers to specific variables and functions based on the lexical nesting structure of ECMAScript code.”(词法环境是一种规范类型,用于根据 ECMAScript 代码的词法嵌套结构,将标识符与特定变量和函数关联起来。)
  • “A Variable Environment is a Lexical Environment whose Environment Record holds bindings created by VariableStatements.”(变量环境是一种词法环境,其环境记录保存由 VariableStatements(即 var 声明)创建的绑定。)
  • “The this binding is a value that is used as the receiver for the current execution context’s code.”
    (this 绑定是一个值,

网站公告

今日签到

点亮在社区的每一天
去签到