老项目里到处是 var,现在该不该全换成 let/const?

打工人秀玲 阅读 254

我们接手了一个三四年前的老前端项目,里面大量使用 var 声明变量,有些函数作用域混乱得不行。我想趁重构机会统一改成 let/const,但又怕改出问题——毕竟有些地方依赖了 var 的变量提升特性。比如下面这段:

function handleData() {
  if (condition) {
    var result = 'success';
  }
  console.log(result); // 这里能正常输出,换成 let 就报错
}

这种情况下,硬改会不会引入新 bug?有没有稳妥的迁移策略?

我来解答 赞 8 收藏
二维码
手机扫码查看
1 条解答
设计师艳敏
这事儿我太有感触了,老项目里 var 确实是个坑。

先说结论:可以换,但别无脑全局替换。得逐个文件甚至逐个函数来处理。

你举的这个例子就是典型的 var 坑——变量提升让 if 外面也能访问 result。换成 let 就报 ReferenceError,这说明代码本身就有隐患,只是 var 掩盖了问题。

迁移策略:

先跑一遍测试,确保有覆盖。ESLint 配个 no-var 规则能帮你筛出哪些地方用了 var。

改的时候注意几种容易出问题的场景:

一是变量提升相关的,像你例子这种:
// 原代码
function handleData() {
if (condition) {
var result = 'success';
}
console.log(result);
}

// 改成这样
function handleData() {
let result; // 先声明
if (condition) {
result = 'success';
}
console.log(result); // 现在是 undefined,不会报错
}


二是循环闭包问题:
// var 时代常见坑
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // 输出 3 3 3
}

// 换成 let 就正常了
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // 输出 0 1 2
}


三是全局 var 会污染 window 对象,这个影响不大但要注意。

我的建议是:先全量搜索 var,按文件逐个改。每改一个文件跑一下测试,确保功能不变。改完用 ESLint 配 no-var 规则锁死,以后新人想用 var 都过不了 lint。

至于 const,能用 const 尽量用 const,只在需要重新赋值的地方用 let。这波重构顺便把代码质量提一下,不亏。
点赞 1
2026-03-11 17:04