我们接手了一个三四年前的老前端项目,里面大量使用 var 声明变量,有些函数作用域混乱得不行。我想趁重构机会统一改成 let/const,但又怕改出问题——毕竟有些地方依赖了 var 的变量提升特性。比如下面这段:
function handleData() {
if (condition) {
var result = 'success';
}
console.log(result); // 这里能正常输出,换成 let 就报错
}
这种情况下,硬改会不会引入新 bug?有没有稳妥的迁移策略?
先说结论:可以换,但别无脑全局替换。得逐个文件甚至逐个函数来处理。
你举的这个例子就是典型的 var 坑——变量提升让 if 外面也能访问 result。换成 let 就报 ReferenceError,这说明代码本身就有隐患,只是 var 掩盖了问题。
迁移策略:
先跑一遍测试,确保有覆盖。ESLint 配个 no-var 规则能帮你筛出哪些地方用了 var。
改的时候注意几种容易出问题的场景:
一是变量提升相关的,像你例子这种:
二是循环闭包问题:
三是全局 var 会污染 window 对象,这个影响不大但要注意。
我的建议是:先全量搜索
var,按文件逐个改。每改一个文件跑一下测试,确保功能不变。改完用 ESLint 配no-var规则锁死,以后新人想用 var 都过不了 lint。至于 const,能用 const 尽量用 const,只在需要重新赋值的地方用 let。这波重构顺便把代码质量提一下,不亏。