在JavaScript循环中应使用let或const声明变量以避免变量提升和作用域污染;let为每次迭代创建独立块级绑定,确保闭包捕获正确值;var因函数作用域和变量提升会导致异步操作输出错误值;for...of/in中也优先用let或const;累积类变量需在循环外声明。

在 JavaScript 循环中正确声明变量,核心是避免变量提升(hoisting)和作用域污染,关键在于使用 let 或 const 替代 var。
用 let 声明循环变量(推荐)
let 为每次迭代创建块级作用域绑定,能确保每个闭包或异步操作捕获到对应轮次的值。
- for 循环中直接用
let i = 0,每次迭代的i是独立绑定 - 配合
setTimeout或事件监听器时不会全部输出最后一个值 - 示例:
for (let i = 0; i < 3; i++) {<br> setTimeout(() => console.log(i), 100); // 输出 0, 1, 2<br> }
避免用 var 声明循环变量
var 是函数作用域,且存在变量提升,循环变量在整个函数内共享同一引用。
- 所有异步回调会共用最终的
i值(通常是循环结束后的值,如 3) - 即使写成
for (var i = 0; ...),也无法隔离每次迭代的作用域 - 旧写法需额外闭包(如 IIFE)绕过,现已不必要
for...of / for...in 中也优先用 let
遍历数组、Map、Set 等可迭代对象时,迭代变量同样应使用 let(或 const,如果内部不重新赋值)。
立即学习“Java免费学习笔记(深入)”;
-
for (const item of arr)更安全:防止意外修改引用 -
for (let key in obj)可以安全重赋值key,但通常用const更合适 - 注意:
const不代表对象不可变,只是变量绑定不可变
需要复用变量时,把声明移出循环
如果变量用于累积、标记或跨轮次计算(如求和、查找标志),应在循环外用 let 声明。
- 例如:
let sum = 0; for (let i = 0; i - 避免在循环内重复声明同名变量(如
let result = ...每轮都写),既低效又易混淆作用域 - 若仅作临时中间值,可直接用表达式,无需单独声明变量


















