let和const通过块级作用域与暂时性死区机制杜绝变量提升隐患:let声明变量仅在{}内有效且初始化前不可访问,for循环中每次迭代创建独立绑定;const强制初始化且禁止重赋值,但允许修改对象/数组内容;两者均禁止重复声明并隔绝跨块污染;实践中应优先使用const,仅需重赋值时用let,彻底避免var。

let 和 const 通过限制变量的可见范围和访问时机,从机制上切断变量提升带来的隐患。它们不把声明“挪到顶部”,也不允许在初始化前使用,让代码行为更符合直觉。
let 声明变量:块内有效,声明前不可用
let 声明的变量只在最近的一对 {} 内生效,比如 if、for、单独代码块等。只要没执行到 let 那一行,变量就处于暂时性死区(TDZ),访问即报错。
- if 块中声明,块外访问会触发 ReferenceError
- for 循环中用 let 声明 i,每次迭代都生成独立绑定,回调函数能正确捕获对应值
- 避免了 var 常见的循环变量泄露问题,比如
for (var i = 0; i console.log(i), 0)输出三个 3,而 let 会输出 0、1、2
const 声明常量:必须初始化,且绑定不可变
const 不仅具备 let 的所有作用域和 TDZ 特性,还强制要求声明时赋值,并禁止后续重新赋值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 声明不赋值:
const PI;→ 报错 - 声明后赋值:
const PI = 3.14; PI = 3.14159;→ 报错 - 对象或数组本身可修改:
const arr = [1]; arr.push(2);合法,因为只是改内容,不是改绑定
两者共同杜绝重复声明和跨块污染
let 和 const 在同一作用域下不允许重复声明,包括与函数参数同名的情况;也天然隔绝不同块之间的变量干扰。
-
let a = 1; let a = 2;→ 报错 -
function foo(a) { let a = 10; }→ 报错,参数 a 已存在 - 多个 if 块各自用 let 声明同名变量,互不影响
实际写法建议:优先 const,需要重赋值才用 let
多数场景下变量值并不需要改变,用 const 更安全、语义更清晰;只有明确要多次修改时再选 let。
- DOM 元素引用、API 配置对象、数学常量等,直接 const
- 计数器、开关状态、临时计算结果等需更新的,用 let
- 完全避免 var,它既无块级作用域,又允许提升和重复声明,容易埋坑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










