块级作用域通过let和const实现,变量仅在{}内有效;let可重新赋值但不可重复声明,const必须初始化且不可赋值,二者均无变量提升;var只有函数作用域且存在变量提升和逃逸问题。

JavaScript 中的块级作用域通过 let 和 const 实现,它们让变量只在定义它的代码块(如 {} 内)中有效,不会像 var 那样被提升或泄露到外层作用域。
什么是块级作用域
块级作用域指变量仅在一对花括号 {} 包裹的区域内可访问。常见块包括:if 语句、for 循环、while 循环、函数体内部的任意 {} 等。只要用 let 或 const 声明,该变量就绑定到这个块,离开即不可见。
let:可重新赋值的块级变量
let 声明的变量具有块级作用域,且不允许重复声明,不存在变量提升(访问前会报 ReferenceError)。
- 在
if块内声明,外部无法访问:
{ let x = 10; }
console.log(x); // ReferenceError: x is not defined - 可在块内多次赋值,但不能在同级块中重复声明:
{ let y = 5; y = 20; } // ✅
{ let y = 1; let y = 2; } // ❌ SyntaxError
const:不可重新赋值的块级常量
const 同样具有块级作用域,且必须初始化;声明后不能重新赋值(对基本类型不可变,对对象/数组则属性/元素仍可修改)。
立即学习“Java免费学习笔记(深入)”;
- 未初始化会报错:
const PI; // SyntaxError: Missing initializer in const declaration - 超出块范围不可访问,且不能重复声明:
{ const obj = {}; }
console.log(obj); // ReferenceError - 对象本身可变,但绑定不可变:
{ const arr = [1]; arr.push(2); // ✅
arr = [3]; // ❌ TypeError: Assignment to constant variable }
与 var 的关键区别
var 只有函数作用域(或全局),没有真正的块级作用域,且存在变量提升和重复声明允许等问题。
-
var在块中声明会“逃逸”到外层函数或全局:
if (true) { var z = 42; }
console.log(z); // 42 ✅(不安全) -
let/const则严格限制在块内:
if (true) { let z = 42; }
console.log(z); // ReferenceError ❌(更安全) -
var允许重复声明,let/const不允许:
var a = 1; var a = 2; // ✅
let b = 1; let b = 2; // ❌


















