var let const
时间: 2025-02-07 17:17:46 浏览: 36
### JavaScript 中 `var`、`let` 和 `const` 的区别
#### 作用域差异
- **全局和函数级作用域**:`var` 关键字声明的变量具有全局或函数级别的作用域。如果在函数外部定义,则属于全局对象的一部分;而在函数内部定义则仅限于该函数内可见[^1]。
- **块级作用域**:相比之下,`let` 和 `const` 提供了更为精确的作用范围——即所谓的“块级作用域”。这意味着当这些关键字被用来在一个大括号 `{}` 内部创建局部环境时(比如循环体内),所声明的变量只在这个特定区域内有效[^2]。
```javascript
if (true) {
var a = 'global';
}
console.log(a); // 输出 "global"
if (true) {
let b = 'block';
}
// console.log(b); 报错, Uncaught ReferenceError: b is not defined
```
#### 可再赋值性
- 对于由 `var` 或者 `let` 定义过的变量来说,在同一个范围内是可以重新赋予新值给它的。然而对于通过 `const` 来初始化的对象而言,默认情况下不允许改变其绑定指向其他地址,但是允许修改它本身的内容(如果是复杂数据结构的话)[^3]。
```javascript
const c = [];
c.push('item'); // 合法操作
// c = ['new item']; 这样做会抛出 TypeError 错误
```
#### 预解析与暂时死区
- 使用 `var` 声明的变量会被提升到当前上下文顶部并预先分配内存空间,即使实际代码位置是在后面才遇到这个声明语句。这种行为称为预解析(hoisting)。
- 而采用 `let` 或 `const` 创建出来的实体不会经历同样的过程,并且直到执行流真正到达相应的那一行之前都不能访问它们,这段时间被称为“暂时死区”(Temporal Dead Zone, TDZ),试图在此期间读取这样的变量将会引发运行时异常。
```javascript
function test() {
console.log(x);
var x = 10;
}
test(); // undefined
try {
function anotherTest(){
console.log(y);
let y = 20;
}
anotherTest();
}catch(e){
console.error("TDZ error:", e.message);
}
```
阅读全文
相关推荐

















