作用域优化时变量提升到底该怎么处理?
我在重构一个老项目,想通过作用域优化减少全局变量污染。但发现把函数内部的变量用 let 提前声明后,有些逻辑反而报错了,比如访问不到之前在 if 块里定义的变量。
我试过把所有变量都提到函数顶部用 let 声明,但又担心这样失去了块级作用域的优势。是不是我理解错了“作用域优化”的正确做法?
function handleData() {
if (condition) {
let temp = fetchData();
process(temp);
}
// 后面还想用 temp,但这里报错
console.log(temp);
}
let和const是块级作用域,不像以前的var那样能穿透到整个函数。在
if里面定义的temp,出了那个{}花括号就销毁了,外面当然访问不到。这不是你理解错了,是let的脾气就是这么倔。想解决这个问题,最直接的办法就是把声明提出来,提到
if外面,赋值还在里面做。这样变量就属于函数作用域了,后面哪里都能用。代码改成这样就行:
这样做虽然看起来有点像以前写
var的习惯,但至少保留了let不能重复定义的特性,也不会污染全局。如果condition没进去,temp就是undefined,记得判空处理一下。当然,更高级的玩法是把
console.log也塞进if里,或者把逻辑拆成小函数,彻底不用外层变量。不过改老代码嘛,有时候为了不炸,先把声明提上去是最稳妥的。慢慢来吧。