块级作用域:变量只在 {}
内有效
传统 var
的问题
var
声明的变量在函数或全局有效,容易意外泄露。
js
if (true) {
var a = 10;
}
console.log(a); // 输出 10(变量泄露到外部)
let
的改进 :
用 let
声明的变量只在当前代码块(如 if
、for
的 {}
)内有效
js
if (true) {
let b = 20;
}
console.log(b); // 报错:b 未定义
用途 :避免循环变量污染全局(如 for(let i=0; ...)
中的 i
不会泄露)
禁止"先使用后声明"(无变量提升
var
的缺陷 :
变量可在声明前使用(值为 undefined
),易引发逻辑错误
js
console.log(x); // 输出 undefined(不报错)
var x = 5;
let
的规则 :
必须先声明后使用,否则直接报错
js
console.log(y); // 报错:y 未定义
let y = 5;
提示:强制规范代码顺序,减少意外错误
暂时性死区(TDZ)
现象描述 :
在块级作用域内,let
声明之前的区域称为"死区",访问变量会报错
js
let tmp = 100;
if (true) {
console.log(tmp); // 报错(死区内)
let tmp = 200; // 声明后才解除死区
}
原因 :let
绑定了当前作用域,不受外部同名变量影响
禁止重复声明
var
允许重复声明 :
同一作用域下多次声明 var
不报错(可能覆盖值)。
let
严格禁止 :
重复声明同一变量会直接报错
js
let z = 10;
let z = 20; // 报错:z 已声明
好处:避免变量被意外覆盖
对比 let
vs var
vs const
特性 | let |
var |
const |
---|---|---|---|
作用域 | 块级作用域 | 函数/全局 | 块级作用域 |
变量提升 | ❌ 禁止 | ✅ 存在 | ❌ 禁止 |
重复声明 | ❌ 禁止 | ✅ 允许 | ❌ 禁止 |
值可变 | ✅ 是 | ✅ 是 | ❌ 基本类型不可变 |
何时用 let
- 需要重新赋值的变量(如循环计数器)。
- 需要隔离作用域避免泄露(如条件语句内的临时变量)。
const
更适合:声明后不再改变的常量(如配置项)。
牢记
"let
守规矩:一屋一变量(块级作用域),先到先得(禁止提升),不玩分身(禁止重复),进门再说话(死区限制)。"