const 和 let 替代 var 的核心价值在于向引擎提供明确块级词法信息,提升作用域分析准确性与运行时优化潜力;其天然绑定 {} 边界,消除函数作用域导致的变量逃逸与歧义。

用 const 和 let 替代 var,核心价值不只是写法更新,而是主动向 JavaScript 引擎提供更明确、更稳定的词法信息,从而提升作用域分析的准确性和运行时优化潜力。
明确块级边界,消除作用域歧义
var 的函数作用域容易导致变量“逃逸”出预期范围(比如 for 循环里的 i 在循环外仍可访问),引擎必须保守推断变量存活时间与可见性。而 let/const 声明天然绑定到最近的 {},引擎能直接从语法结构中确定:该变量只存在于这个块内、不会被外部读写、也不会被内部嵌套块意外覆盖(除非同名声明新绑定)。
- 例如:
for (let i = 0; i → 引擎知道 i 是每次迭代独立的新绑定,适合做闭包优化或内存及时回收 - 对比:
for (var i = 0; i → 引擎只能认为 i 是函数级单变量,需全程保留,且易引发闭包引用错误
禁止重复声明,固化绑定关系
let/const 在同一作用域下禁止重复声明,意味着引擎在解析阶段就能确认:某个标识符名在此作用域内只对应一个确定的绑定(binding),不会出现 var 那种“后声明覆盖前声明”的动态重绑定行为。这减少了符号表(Lexical Environment)在运行时的不确定性,有利于提前生成更精准的静态作用域链。
- 引擎无需为同一名字预留多个可能的值槽位或做运行时绑定检查
- 调试器和 DevTools 也能更可靠地映射变量名到内存位置
强制初始化 + 暂时性死区(TDZ),增强定义-使用顺序可预测性
const 必须声明即赋值;let 虽可延迟赋值,但在声明前访问会报错(TDZ)。这种语法强制让引擎清楚知道:某个变量从哪一行开始“真正可用”,中间不存在“已声明但未定义”的模糊状态。相比 var 提升后值为 undefined 的弱信号,TDZ 提供了更强的时序约束,使作用域分析可结合执行流做更精细的活性分析(liveness analysis)和死代码判断。
- 例如:
console.log(x); let x = 1;→ 引擎在解析时即可标记 x 尚未进入活跃期,避免误判为未声明错误或默认初始化 - 这对 JIT 编译器识别安全的常量传播(constant propagation)或内联时机有实际帮助
优先使用 const,向引擎传递不可变意图
const 不仅是“不能重新赋值”的限制,更是对引擎的明确提示:该绑定指向的值在整个作用域生命周期内稳定。引擎可据此做更多假设——比如缓存其原始值、跳过某些写屏障(write barrier)、或对 const 对象的属性访问做更激进的内联缓存(IC)优化(尤其当对象字面量结构简单且未被修改时)。
- 即使声明的是对象:
const obj = { a: 1 };,引擎仍可信任obj引用本身不变,利于对象形状(hidden class)稳定跟踪 - 配合
Object.freeze()还可进一步扩展不可变语义,但 const 本身已是基础层的关键信号

















