JavaScript执行上下文是代码运行的环境容器,分全局、函数、eval三类,生命周期含创建(变量提升/TDZ)和执行两阶段,通过词法环境与变量环境管理变量,并依托执行栈实现上下文切换。

JavaScript的执行上下文(Execution Context)是代码运行时的“环境容器”,它决定了变量、函数能被访问的范围,以及它们的生命周期。简单说,每执行一段代码(比如全局代码、函数调用),JS引擎都会创建一个执行上下文来管理其中的变量、函数声明和this绑定。
执行上下文的三种类型
JS中主要有三类执行上下文:
- 全局执行上下文:脚本启动时自动创建,只有一个。它管理全局变量、顶层函数声明,以及全局作用域中的this(浏览器中指向window)。
- 函数执行上下文:每次调用函数时创建,每次调用都独立生成一个。它包含该函数内部声明的变量、参数、内部函数,以及对应的this值。
- Eval执行上下文:由eval()函数执行字符串代码时创建(日常开发中极少使用,且不推荐)。
执行上下文的生命周期:创建与执行两阶段
每个执行上下文分两个阶段构建:
- 创建阶段:JS引擎先扫描代码,完成三件事——建立词法环境(LexicalEnvironment),初始化变量对象(VariableEnvironment),绑定this值。此时var声明的变量被设为undefined(变量提升),let/const被放入“暂时性死区”(TDZ),尚未初始化。
- 执行阶段:逐行运行代码,真正给变量赋值、执行函数调用。遇到let/const时,才正式初始化;访问TDZ中的变量会报ReferenceError。
变量管理的核心机制:词法环境与变量环境
执行上下文中用两个关键对象管理变量:
立即学习“Java免费学习笔记(深入)”;
- 词法环境(LexicalEnvironment):主要存储let、const声明及函数声明,还包含一个outer引用,指向外部词法环境(用于实现作用域链)。
- 变量环境(VariableEnvironment):专门处理var声明(历史原因保留,现在多数情况与词法环境一致)。在函数上下文中,它也负责管理函数参数和arguments对象。
当查找变量时,JS引擎先在当前词法环境里找,找不到就顺着outer引用向外层词法环境中查找,直到全局上下文——这就是作用域链的工作原理。
执行栈与上下文切换
JS是单线程的,所有执行上下文按调用顺序压入**执行栈(Call Stack)**:
- 全局上下文最先入栈,始终在最底层。
- 每次函数调用,对应的新上下文被推入栈顶。
- 函数返回后,其上下文被弹出,控制权交还给栈中下一个上下文。
你可以把执行栈想象成一个“任务清单”,当前正在执行的是栈顶的那个上下文,它的变量环境和词法环境就是此刻代码能看到的全部变量来源。










