let在循环中具有块级作用域和每次迭代独立绑定特性;for循环头部声明可自动为每次迭代创建新绑定,而while需手动构造块实现隔离,for...in/of中不可在循环体内重复声明同名变量。

在 JavaScript 循环内部用 let 声明变量,核心在于理解它的**块级作用域**和**每次迭代独立绑定**的特性——这正是它比 var 更安全、更符合直觉的关键。
let 在 for 循环中自动为每次迭代创建新绑定
这是最常用也最典型的场景。使用 for (let i = 0; i 时,JavaScript 引擎会为每一次循环迭代创建一个独立的 <code>i 绑定,而不是复用同一个变量。
- 这意味着在循环内异步操作(如
setTimeout或 Promise)中访问i,能得到预期的当前轮次值 - 而用
var i则所有回调共享同一个i,最终都输出3
✅ 正确示例:
for (let i = 0; i setTimeout(() => console.log(i), 100); // 输出 0, 1, 2避免在 for...in / for...of 中错误地重复声明
for...in 和 for...of 同样支持 let,但要注意:不能在循环体内部再次用 let 声明同名变量,否则会报错(重复声明)。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- ✅ 推荐写法:直接在循环头部声明,如
for (let key in obj)或for (let item of arr) - ❌ 错误写法:
for (let item of arr) { let item = ... }—— 同一作用域重复声明
while / do...while 中 let 的作用域仅限于循环体内部
与 for 不同,while 循环本身没有“隐式块”,所以 let 必须显式写在循环体内(或提前声明),且每次迭代不会自动新建绑定。
- ⚠️ 注意:在
while中用let i = 0写在循环外,然后在循环内修改它,是合法的,但仍是同一个绑定 - ✅ 如果真需要每次迭代隔离变量(比如嵌套异步),可手动用
{ let x = ... }创建块级作用域
示例:
let i = 0;while (i let current = i; // 每次迭代新建 current 绑定
setTimeout(() => console.log(current), 100);
i++;
}
不要在循环条件或更新表达式中用 let 声明
for 语句的初始化、条件、更新三部分中,只有初始化部分允许使用 let(或 const、var);条件和更新部分只能是表达式,不能出现声明。
- ✅ 合法:
for (let i = 0; i - ❌ 非法:
for (let i = 0; let i 或 <code>for (let i = 0; i
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










