优先使用 let 或 const 声明变量,避免 var;let/const 具备块级作用域、无变量提升(但有 tdz),for 中 let 每次迭代创建新绑定;需避开暂时性死区,合理设计块结构,并注意 const 仅绑定不可变。

在 JavaScript 块级作用域中,正确声明和使用变量的关键是:**优先用 let 或 const,避免用 var;明确变量生命周期,不跨块访问未声明或已销毁的绑定。**
用 let 和 const 替代 var
var 没有真正的块级作用域,它会函数提升(hoisting)且可重复声明,容易导致意料外的行为。而 let 和 const 是 ES6 引入的块级绑定方式,只在声明所在的块(如 {...}、if、for、switch)内有效。
-
let用于声明可重新赋值的变量,不允许重复声明,不存在变量提升(但存在“暂时性死区”TDZ) -
const用于声明常量,必须初始化,且不能重新赋值(注意:对象/数组本身可修改,只是绑定不可变) - 在
for循环中,let每次迭代都会创建新绑定,适合异步回调中捕获当前值
理解并避开“暂时性死区”(TDZ)
在块内,let 和 const 声明的变量从块开始到声明语句执行前,处于暂时性死区。此时访问会抛出 ReferenceError,而不是返回 undefined。
- 错误示例:
console.log(x); let x = 1;→ 报错 - 正确做法:确保在声明之后再访问;若需提前使用,考虑是否该把逻辑移到声明后,或改用函数封装
- TDZ 不影响
typeof检测(typeof y在let y前仍报错),这点和var不同
合理设计块结构,避免意外泄漏或访问失效
块级作用域不是“自动隔离一切”,它的边界由显式的花括号 {} 定义,包括独立块、条件块、循环块等。
- 独立块(如
{ let a = 1; console.log(a); })中声明的变量外部不可见 - 在
if或for中声明的变量,仅在对应分支或循环体内有效;不要试图在块外读取它们 - 嵌套块中,内层可访问外层变量(作用域链),但外层无法访问内层声明——这是封闭性的体现
- 注意:
try/catch的catch子句也有自己的块级作用域,catch(e)中的e只在该块内有效
常见误区与实用建议
实际开发中容易忽略细节,导致调试困难:
- 不要在块内用
var试图模拟块级作用域——它仍会提升到函数顶部 -
const声明的对象,别误以为属性不可变;如需真正冻结,配合Object.freeze() - 循环中需要闭包行为时(如定时器、事件监听),用
let而非var或函数参数传值 - 工具层面:启用 ESLint 规则(如
no-var、prefer-const)可主动拦截不规范写法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











