var是函数/全局作用域、存在变量提升;let/const是块级作用域、存在暂时性死区;const禁止重新赋值但允许修改引用类型内部属性,且三者在重复声明和全局污染上表现不同。

直接抓住三个关键字的本质差异,再结合典型场景验证理解,比死记硬背更牢靠。
搞清作用域边界:哪里能用、哪里报错
var 只认函数或全局,不认 {};let 和 const 严格绑定在最近的 {} 内(包括 if、for、独立块)。
比如在 if 块里声明:var a = 1,块外仍可访问;let b = 2 或 const c = 3,块外访问直接报 ReferenceError。
盯紧变量提升和暂时性死区(TDZ)
var 声明会被提到作用域顶部,但值还是 undefined;let/const 不提升,声明前访问就卡住报错。
常见陷阱示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
console.log(x); var x = 10;→ 输出undefined -
console.log(y); let y = 20;→ 报错,进 TDZ -
console.log(z); const z = 30;→ 同样报错,const 也有 TDZ
分清“不可变”的真实含义
const 禁止的是重新赋值,不是禁止修改内容。
基础类型(number/string/boolean)赋值后确实不能改;
引用类型(object/array/function)可以改内部属性或元素,只是不能把变量指向另一个新对象。
立即学习“Java免费学习笔记(深入)”;
-
const arr = [1, 2]; arr.push(3);→ 允许,arr 还是原来那个数组 -
arr = [4, 5];→ 报错,试图改变引用 -
const obj = { a: 1 }; obj.a = 2;→ 允许
看懂重复声明和全局污染风险
var 允许同一作用域多次声明,后声明覆盖前声明;let/const 在同一作用域重复声明直接语法错误。
var 在全局作用域声明会自动挂到 window 上,容易命名冲突;let/const 不会。
-
var name = "a"; var name = "b";→ 不报错,name 是 "b" -
let age = 20; let age = 21;→ 报SyntaxError -
var globalVar = 1;→window.globalVar存在;let localVar = 2;→window.localVar是undefined

















