let和var的核心区别有三点:作用域上let限于花括号内,var提升至函数或全局;var存在变量提升(声明前置、值为undefined),let有暂时性死区(声明前访问报错);var允许重复声明,let在同一作用域下禁止重复声明。

JavaScript 中 let 和 var 声明变量的区别,核心就三点:作用域、变量提升、重复声明
不用记“块级作用域”这种术语,直接看行为:let 声明的变量只在它出现的花括号 {} 内有效;var 声明的变量会“跑出” {},跑到整个函数(或全局)里去。
比如:
function test() {
if (true) {
var a = 1;
let b = 2;
}
console.log(a); // 1 —— var 跑出来了
console.log(b); // ReferenceError: b is not defined —— let 没跑出来
}
var 会变量提升,let 不会(但有“暂时性死区”)
var 声明会被“提升”到函数或全局顶部,赋值不提升。所以你能在声明前读取它(值是 undefined);let 不会提升,更严格——在声明语句执行前访问它,直接报错。
-
console.log(x); var x = 10;→ 输出undefined(不报错) -
console.log(y); let y = 10;→ 报ReferenceError: Cannot access 'y' before initialization
这个报错就是“暂时性死区”(TDZ):从块开始到 let 声明执行前,该变量名不可访问。
立即学习“Java免费学习笔记(深入)”;
能否重复声明?var 允许,let 不允许
同一个作用域下:
-
var a = 1; var a = 2;→ 合法,a最终是2 -
let b = 1; let b = 2;→ 报SyntaxError: Identifier 'b' has already been declared
注意:不同作用域可以同名,比如函数内 let 和全局 let 不冲突;但同一作用域内重名就是错。
实际开发中怎么选?
现代 JS 开发基本只用 let(和 const),除非你要显式利用 var 的函数作用域或变量提升特性(极少见)。
- 默认用
const,值会变时改用let - 别用
var,尤其在循环、异步回调、条件块里,var容易引发意料外的共享变量问题 - 比如
for (var i = 0; i console.log(i), 0);会输出三个3;换成let i就输出0, 1, 2
真正容易被忽略的是 TDZ —— 它不是语法错误,而是运行时报错,而且只在你“提前访问”时触发,调试时容易绕晕。写代码时养成“先声明再用”的习惯,比记规则更可靠。











