Js如何存储执行上下文

Js如何存储执行上下文
最新回答
别跟我狂,容易亡

2026-10-29 18:32:29

JavaScript 通过执行上下文栈(Execution Context Stack)管理代码执行,其核心机制如下:

1. 执行上下文栈的工作流程
  • 全局上下文:程序启动时创建,压入栈底,程序结束时才出栈。
  • 函数调用:每次调用函数时,创建新的函数执行上下文并压入栈顶,执行完毕后出栈,控制权交还上层上下文。
  • 栈顶规则:当前执行的上下文始终位于栈顶,引擎单线程处理,同一时间仅执行一个上下文。
2. 执行上下文的类型
  • 全局执行上下文:默认最外层上下文,对应全局对象(如浏览器中的 window)。
  • 函数执行上下文:每次函数调用时创建。
  • eval 执行上下文:通过 eval 函数执行代码时创建(不推荐使用)。
3. 执行上下文的结构

每个上下文包含三部分:

  • 词法环境(Lexical Environment)

    处理 let/const 声明及作用域链。

    包含环境记录(变量/函数绑定)和对外层词法环境的引用。

  • 变量环境(Variable Environment)

    存储 var 声明的变量(历史遗留设计)。

  • This 绑定(This Binding)

    确定当前代码中 this 的指向(如全局对象、函数调用对象等)。

ES6 规范中的伪代码表示:

ExecutionContext = { LexicalEnvironment: <词法环境>, VariableEnvironment: <变量环境>, ThisBinding: <this 值>}4. 示例分析

以代码为例:

function foo() { function bar() { console.log('bar'); } bar();}foo();

上下文栈变化过程:

  1. 全局上下文入栈(程序启动)。
  2. 调用 foo() → foo 上下文入栈。
  3. 调用 bar() → bar 上下文入栈。
  4. bar() 执行完毕 → bar 上下文出栈。
  5. foo() 执行完毕 → foo 上下文出栈。
  6. 返回全局上下文(程序结束时出栈)。
5. 机制的意义
  • 作用域链:通过词法环境的嵌套引用实现。
  • 闭包:函数执行后其词法环境仍被保留(若被外部引用)。
  • this 解析:依赖 ThisBinding 动态确定指向。
总结

JavaScript 通过执行上下文栈动态管理代码执行环境,每个上下文包含词法环境、变量环境和 this 绑定。函数调用时上下文入栈,执行完毕后出栈,这一机制是理解作用域、闭包和 this 行为的核心基础。