在JavaScript里,let和var都用来声明变量,但它们的行为差别很大,理解这些差别能帮你避开很多常见的坑。下面我们先看一张示意图相关的概念对比。

一、作用域不同
var遵循函数作用域,只要在同一个函数里,变量到处都能访问;let遵循块级作用域,只在最近的{}内有效,比如if、for、while里面。
1. var的函数作用域
下面代码中,用var在if里声明的变量,在if外面也能取到:
if (true) {
var a = 10;
}
console.log(a); // 输出 10
2. let的块级作用域
把上面改成let,在块外访问就会报错:
if (true) {
let b = 20;
}
console.log(b); // ReferenceError: b is not defined
二、变量提升与暂时性死区
var声明的变量会被提升到函数顶部,默认值是undefined;let也会被提升,但在声明前访问会进入暂时性死区,直接报错。
console.log(x); // undefined var x = 5; console.log(y); // ReferenceError let y = 5;
三、重复声明
在同一个作用域内,var可以重复声明同一个变量,let不行:
var m = 1; var m = 2; // 合法 let n = 1; let n = 2; // SyntaxError: Identifier 'n' has already been declared
四、在循环中的表现
在for循环里用var常导致闭包问题,let则每次迭代都有独立绑定:
for (var i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i); // 输出三次 3
}, 0);
}
for (let j = 0; j < 3; j++) {
setTimeout(function () {
console.log(j); // 输出 0 1 2
}, 0);
}
五、怎么用才合适
日常开发建议默认使用let,需要约束变量范围更安全;var只在维护老代码或明确需要函数作用域时用。下面是简单对照表:
| 特性 | var | let |
|---|---|---|
| 作用域 | 函数级 | 块级 |
| 变量提升 | 提升并初始化为undefined | 提升但不初始化 |
| 重复声明 | 允许 | 不允许 |
掌握let和var的区别后,写JS时会少很多莫名其妙的bug,代码也更易懂。
letvarJavaScript作用域修改时间:2026-07-30 18:57:21