let 和 const 通过块级作用域解决 var 的作用域混乱问题:let 限制变量作用域、禁止重复声明且无变量提升;const 声明不可重新赋值的常量,同样具块级作用域;推荐默认使用 const,仅需改写时用 let。

用 let 和 const 就能自然解决块级作用域问题,关键在于它们只在声明所在的代码块(如 {} 内)有效,不会像 var 那样被提升或泄漏到外层作用域。
let 声明变量:限制作用域 + 不允许重复声明
let 声明的变量仅在当前块级作用域内可访问,且不会发生变量提升(即不能在声明前使用)。这避免了 var 在 for 循环或 if 块中意外污染外层作用域的问题。
- 在
for循环中,每次迭代都有独立的绑定,闭包能正确捕获当前值 - 在
if或while块中声明,块外无法访问该变量 - 同一作用域下重复用
let声明同名变量会报错,防止误覆盖
const 声明常量:不可重新赋值 + 同样具备块级作用域
const 也具有块级作用域,且声明时必须初始化。它不允许对绑定本身重新赋值(但对象或数组的内容仍可修改)。
- 适合声明配置项、DOM 元素引用、函数等不打算重新指向的值
- 和
let一样,不存在变量提升,声明前访问会报ReferenceError - 在
if块或for循环内声明,作用域严格受限
对比 var:为什么它会引发作用域混乱
var 只有函数作用域(或全局作用域),没有块级作用域。即使写在 if 或 for 块里,也会被提升到函数顶部,导致意料之外的访问或覆盖。
立即学习“Java免费学习笔记(深入)”;
-
var在块内声明,块外仍可读写,容易造成命名冲突 - 循环中用
var声明计数器,所有回调共享同一个变量引用 - 重复
var声明同名变量不会报错,可能掩盖逻辑错误
实际用法建议:默认用 const,需要改写时才用 let
这是现代 JavaScript 的推荐实践——先用 const,只有确定变量后续要重新赋值(比如循环计数器、临时状态)才改用 let。这样既强化了不可变性意识,又天然规避了大部分作用域陷阱。
- 函数参数、API 返回值、DOM 查询结果,优先
const -
for循环中的索引变量(i)、累加器(sum)用let - 避免在条件块外提前声明变量,让声明尽可能靠近使用位置


















