核心是用 let 替代 var 声明循环变量,使每次迭代的变量绑定到当前块级作用域,实现自然隔离;var 声明的 i 会提升至函数或全局作用域并泄漏,而 let 声明的 i 仅在当轮循环块级作用域内有效,且每轮创建独立绑定,避免闭包中输出重复值。

核心是用 let 替代 var 声明循环变量,让每次迭代的变量绑定到当前块级作用域,自然隔离、不泄漏。
for 循环中用 let 声明计数器
传统 var i 会提升并挂载到函数或全局作用域,循环结束后 i 仍可访问,造成污染;而 let i 将 i 绑定到每轮循环的块级作用域中,循环结束即不可访问。
for (var i = 0; ifor (let i = 0; i
for...of / for...in 中直接使用 let 解构
遍历数组、Map、Set 或对象时,推荐用 for (let item of array) 或 for (let [key, val] of map)。每次迭代的 item、key、val 都是独立绑定的块级变量,不会相互覆盖,也绝不会跑到全局。
- 避免混用
var:比如for (let [k, v] of map) { var k = 'x'; }会报错(重复声明),也破坏语义,应统一用let或const - 若值不重赋,优先用
const:如for (const key of Object.keys(obj)) { ... },更安全且明确意图
异步回调中安全捕获循环变量
在定时器、事件监听、Promise.then 等异步场景里,只要循环变量用 let 声明,内部箭头函数或普通函数就能正确捕获当轮的值,无需 IIFE 封装。
-
for (let i = 0; i console.log(i), 100); }→ 输出 0、1、2(不是三个 3) - 这是因
let为每轮迭代创建了独立绑定,而非共享一个变量引用
避免手动扩展作用域边界
不要为了“模拟块级作用域”而套用多余的大括号或 IIFE。ES6 的 let 和 const 已原生支持 for、if、{} 等语法块的作用域隔离,IIFE 在现代环境属于过时方案。
- 不用写:
for (var i = 0; i - 只需写:
for (let i = 0; i —— 更简洁、可读、可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











