现代 javascript 工程中应弃用 var,因其存在作用域泄漏、变量提升导致的不可靠时序及重复声明隐患;let 和 const 提供块级作用域、tdz 保障初始化顺序、禁止重复声明,并按语义分工:const 用于不变值,let 用于可变值。

现代 JavaScript 工程中,var 已基本被弃用,不是因为语法错误,而是它带来的作用域、提升和重复声明问题,在协作开发和大型项目中极易引发隐蔽 bug。替代方案明确、成熟,迁移成本极低。
块级作用域是核心诉求
JavaScript 早期只有函数作用域,var 声明的变量会“泄漏”出 if、for 等块级结构,污染外层作用域:
-
var在if(true) { var x = 1; }后仍可访问x,逻辑边界模糊 -
let和const严格绑定在{}内,作用域清晰可预测 - 循环中使用
let i每次迭代都生成新绑定,彻底解决经典的setTimeout闭包陷阱
变量提升带来不可靠的执行时序
var 的声明会被提升到作用域顶部,但赋值不提升,导致“能访问但值为 undefined”的中间态:
-
console.log(a); var a = 2;不报错,但输出undefined,掩盖初始化意图 -
let/const存在“暂时性死区(TDZ)”,在声明前访问直接抛ReferenceError,强制开发者按顺序组织逻辑 - 这种报错行为更符合直觉,也更容易在开发阶段暴露问题
重复声明削弱代码健壮性
var 允许同名重复声明,后声明覆盖前声明,且不报错:
-
var x = 1; var x = 2;合法,但容易因拼写错误或疏忽导致意外交互 -
let x = 1; let x = 2;直接报语法错误,从源头阻止命名冲突 - ESLint 等工具普遍启用
no-var和no-redeclare规则,CI 流水线会拦截此类代码
现代声明方式有明确分工
不再用 var 并不等于全用 let,而是根据语义选择:
- 值确定不变 → 用
const(包括对象、数组,只要不重新赋值给该标识符) - 值需后续修改 → 用
let(如循环计数器、状态暂存) - 函数参数、解构赋值默认视为
const,除非显式需要重赋值 - 全局配置、环境常量一律
const,增强可读性和运行时保障
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











