词法作用域是函数定义时确定的静态作用域关系,决定执行上下文的词法环境链、var/let/const在变量环境与词法环境中的分工、闭包的形成机制及箭头函数this的继承逻辑。

词法作用域是理解函数执行上下文的关键入口——它不是运行时决定的,而是在函数**定义时就固定下来的作用域关系**。这种静态绑定直接决定了函数执行时“去哪里找变量”,从而塑造了执行上下文的结构和行为。
词法作用域决定执行上下文的词法环境链
每个函数在定义时,其内部就悄悄记住了外层作用域的词法环境(即“父级词法环境”)。当该函数被调用、创建执行上下文时,这个预存的引用会被复制到新上下文的词法环境字段中,形成作用域链的起点。
例如:
function outer() {const x = 10;
return function inner() {
console.log(x); // x 不在 inner 自身词法环境中,但 inner 的词法环境引用了 outer 的词法环境
};
}
const fn = outer();
fn(); // 输出 10
这里 inner 函数执行时,它的词法环境记录中没有 x,但它通过外部引用找到了 outer 的词法环境,进而访问到 x。这个查找路径就是由词法作用域预先确定的。
变量声明方式影响执行上下文的两个环境分工
执行上下文内部实际包含词法环境和变量环境两个平行结构,它们的分工由词法作用域规则驱动:
- var 声明归入变量环境:在执行上下文创建阶段就被提升并初始化为 undefined,作用域是整个函数体(函数作用域)
- let/const 声明归入词法环境:只在声明所在的块级作用域生效,且在声明前处于暂时性死区(TDZ),体现的是词法作用域的精确边界
这意味着:即使同一段代码里混用 var 和 let,执行上下文也会按词法作用域的语义,把它们分发到不同环境里管理,从而解释为何 var 可以提前访问而 let 不行。
闭包是词法作用域在执行上下文中的延续表现
当函数返回后,其执行上下文本该销毁,但如果内层函数仍被引用(如赋值给外部变量),JavaScript 引擎会保留它所依赖的外层词法环境——因为词法作用域规定了“inner 必须能访问 outer 的变量”,这个约束在执行上下文创建时已写死。
换句话说,闭包不是特殊机制,而是词法作用域 + 执行上下文生命周期管理共同作用的自然结果:执行上下文可以结束,但它的词法环境若被闭包持有,就会继续存活。
this 不由词法作用域决定,但调用位置受其约束
词法作用域不参与 this 绑定(this 是执行阶段动态确定的),但它会影响函数在哪里被定义、进而影响它可能被如何调用。比如箭头函数的 this 继承自外层词法环境,正是因为它的 this 查找规则被词法作用域“固化”了——它不会创建自己的 this,而是沿词法环境链向上找最近的非箭头函数的 this。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











