javascript中块级作用域由let和const实现,其变量仅在花括号{}包裹的代码块内有效,不被提升且受暂时性死区约束;let可重赋值,const需初始化且不可重赋值,二者均避免var的函数作用域与变量提升问题。

JavaScript 中块级作用域通过 let 和 const 实现,核心在于它们的声明不会被提升(no hoisting),且仅在定义它们的**花括号 {} 所包裹的代码块内有效**——比如 if、for、while 语句或显式用 {} 包裹的代码段。
let 声明创建可重新赋值的块级绑定
let 声明的变量只在当前块(如 if 块、for 循环体、独立 {})中存在,外部无法访问,且不允许重复声明同名变量(在同一作用域内):
- 在 for 循环中,每次迭代都有独立的绑定,适合闭包场景
- 不能在声明前使用(暂时性死区 TDZ),比如 console.log(a); let a = 1; 会报错
- 不同于 var,不会绑定到函数或全局对象上(如 window)
const 声明创建不可重新赋值的块级绑定
const 也具有块级作用域,但要求声明时必须初始化,且后续不能重新赋值:
- 绑定本身不可变,但若值是对象或数组,其内部属性/元素仍可修改
- 同样受 TDZ 约束,声明前访问会抛出 ReferenceError
- 适合声明配置项、DOM 引用、函数常量等不打算重赋值的标识符
块级作用域的实际边界示例
以下代码能清晰体现块的作用范围:
- if (true) { let x = 1; const y = 2; } console.log(x); // ReferenceError
- for (let i = 0; i console.log(i), 0); } // 输出 0, 1(每个 i 是独立绑定)
- { const PI = 3.14; } console.log(PI); // ReferenceError
和 var 的关键区别
var 声明的是函数作用域(或全局作用域),且存在变量提升和函数作用域内的“共享绑定”问题:
- var 在 if 或 for 内声明,仍可在块外访问
- for 循环中用 var 声明 i,所有 setTimeout 共享同一个 i,最终输出全是循环终值
- var 声明会被提升到函数顶部,初始值为 undefined;let/const 提升但不初始化,进入 TDZ
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











