let和const声明变量可形成块级作用域,避免变量提升和意外泄露;循环中let每次迭代创建新绑定,解决闭包问题;裸露代码块可封装临时逻辑,防止污染外层作用域。

用 let 和 const 声明变量,配合代码块(如 {}、if、for、函数等)自然形成块级作用域,就能有效隔离变量,避免意外覆盖或冲突。
用 let/const 替代 var
var 只有函数作用域,且存在变量提升,容易在不同逻辑块中误用同名变量;let 和 const 是真正的块级声明,出了大括号就不可访问。
- ✅ 正确示例:
if (true) {<br> let userId = 1001;<br> const API_URL = '/api/user';<br> console.log(userId); // 1001<br>}<br>console.log(userId); // ReferenceError: userId is not defined - ❌ 避免这样写:
if (true) {<br> var temp = 'old';<br>}<br>console.log(temp); // 'old' —— 意外泄露,可能和外层 temp 冲突
在循环中安全复用变量名
使用 let 声明的循环变量,每次迭代都会绑定一个新的绑定(binding),避免闭包中常见的“全部输出最后一个值”问题,也防止手动重复命名。
- ✅ 推荐写法(每个 i 独立):
for (let i = 0; i < 3; i++) {<br> setTimeout(() => console.log(i), 100); // 输出 0, 1, 2 - ✅ 同样适用于 for...of / for...in:
const items = ['a', 'b', 'c'];<br>for (let item of items) {<br> console.log(item); // 不会和外部 item 变量冲突
用立即执行块封装临时逻辑
当一段代码只是临时计算、初始化或调试,不想污染外层作用域时,可用裸露的块(IIFE 已不常用,裸块更轻量)包裹。
立即学习“Java免费学习笔记(深入)”;
- ✅ 示例:
{<br> const base = 10;<br> let count = 0;<br> while (count < 3) {<br> console.log(base * count);<br> count++;<br> }<br>}<br>// base 和 count 在这里自动销毁,不会影响外面 - ⚠️ 注意:裸块不能直接跟在
if或return后(语法错误),需加括号或换行确保解析正确。
函数内部优先使用块级声明
函数本身是作用域边界,但内部再细分逻辑块(如条件分支、数据处理段)时,就地用 let/const 声明,比全堆在函数顶部更清晰、更安全。
- ✅ 更健壮的写法:
function processUser(data) {<br> if (data.role === 'admin') {<br> const permissions = ['read', 'write', 'delete'];<br> return permissions;<br> }<br> if (data.role === 'user') {<br> const permissions = ['read'];<br> return permissions;<br> }<br> return [];<br>} - ? 这里两个
permissions互不影响,命名可一致,语义更明确。


















