用 let 和 const 替代 var 可修复变量提升、作用域混乱和重复声明问题:var 仅具函数作用域、存在提升且允许多次声明,易致闭包捕获错误值、同名遮蔽及块级作用域失效;let/const 提供块级作用域、禁止重复声明,const 还强制初始化且不可重赋值。

用 let 和 const 替代 var 是重构的关键,核心是修复变量提升、作用域混乱和重复声明问题。
识别 var 的典型隐患
var 声明的变量存在函数作用域、变量提升(hoisting)和可重复声明等特性,容易引发意外行为。常见场景包括:
- for 循环中用
var声明计数器,回调里访问时值已改变(如setTimeout中输出全是最后一个 i) - 同名
var在同一作用域多次声明不报错,掩盖逻辑错误 - 条件块(
if)内用var声明,变量实际在函数顶部被提升,导致“本该不存在却能访问”
按作用域粒度逐层替换
不要全局搜索替换 var → let,而应结合语义判断:
- 变量只赋值一次且不重赋值 → 优先用
const(如配置对象、DOM 引用、函数返回值) - 变量后续会重新赋值(如累加器、循环变量、状态标记)→ 用
let - 原
var出现在函数体顶层,但逻辑上属于某个if或for块 → 把声明移到对应块内,改用let/const - 原
var被设计为“函数内共享”,且确实需要跨块访问 → 保留为let并移至函数顶部(此时let的块级作用域不影响,因它在函数块顶层)
重点处理循环与异步闭包
这是 var 最易出错的地方,也是重构收益最大的部分:
- 旧写法:
for (var i = 0; i console.log(i), 100)→ 输出 3, 3, 3 - 重构后:
for (let i = 0; i console.log(i), 100)→ 输出 0, 1, 2(每个迭代有独立绑定) - 若需兼容老旧环境或明确意图,也可用
for (var i = 0; i console.log(ii), 100) },但直接用let更简洁
借助工具辅助验证
手动重构后建议用静态检查保障正确性:
- 开启 ESLint 规则:
"no-var": "error"和"prefer-const": "warn" - 启用 TypeScript 编译选项
noImplicitAny和strict,能提前暴露因作用域变化导致的未定义变量引用 - 运行时可临时加
"use strict",让重复var声明或未声明赋值抛错,帮助定位残留问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











