JavaScript执行上下文是代码运行的环境容器,决定变量、函数、this的查找与求值;分全局、函数、eval三种类型,生命周期含创建(处理声明与this)和执行(赋值与运算)两阶段,由执行上下文栈调度。
JavaScript执行上下文(Execution Context)是代码运行时的“环境容器”,它决定了变量、函数、this等如何被查找和求值。理解它,就等于看懂了JS代码“从哪开始执行、变量在哪能用、为什么有些变量还没定义就能调用”这些关键问题的底层逻辑。
JS中主要有
三种执行上下文:
window)、this指向、以及最外层的变量和函数声明。this值。eval()中执行字符串代码时创建,行为类似函数上下文但有安全与性能风险,现代开发中基本不用。每个上下文分两步构建,这个过程直接影响你看到的“变量提升”现象:
let/const为uninitialized状态;var声明设为undefined,函数声明直接赋值为函数体;this值(全局中是全局对象,普通函数调用中也是全局对象,箭头函数则继承外层this)。var赋实际值;let/const执行赋值(若在声明前访问,会报ReferenceError,即暂时性死区TDZ);JS是单线程的,靠执行上下文栈管理当前正在运行和待运行的上下文:
例如:foo()调用bar(),再调用baz(),栈从底到顶就是:[全局 → foo → bar → baz]。任一函数出错,错误堆栈正是这个顺序的反向体现。
很多常见行为都由上下文机制决定:
var和函数声明生效:因为它们在创建阶段就被处理;let/const虽也进入词法环境,但处于TDZ,不能访问。this不是由函数定义位置决定,而是由调用方式决定:因为this是在函数上下文创建阶段绑定的,取决于谁调用、怎么调用(obj.fn()、fn.call(obj)、箭头函数等规则不同)。