说明
let和var是JavaScript中用于声明变量的关键字,它们在一些方面有共同点,但也存在一些重要的区别。
共同点
- 变量声明:无论是'let'还是'var',都用于声明变量,使得我们可以在代码中存储和操作数据。
- 赋值:无论是'let'还是'var'声明的变量,都可以通过赋值来存储数据。
不同点
作用域
-
‘let’具有块级作用域(block scope),它在声明的块(花括号'{}'内)中可见。
-
‘var’具有函数作用域(function scope),它在声明的函数体内可见。
变量提升
- var声明的变量会被提升到它们所在的作用域的顶部,可以在声明之前使用,但值为undefined。
- let声明的变量也会被提升,但在声明之前访问会触发暂时性死区(Temporal Dead Zone,TDZ)错误。
重复声明:
- 在同一作用域内,使用'var'可以重复声明同名变量,后面的声明会覆盖前面的。
- 使用'let'在同一作用域内重复声明同名变量会导致错误。
全局对象属性:
- 使用var声明的变量会成为全局对象(例如浏览器环境下的window对象)的属性,可以通过全局对象访问。
- 使用let声明的变量不会成为全局对象的属性,不会污染全局命名空间。
循环中的行为:
- 在for循环中使用var声明的变量在循环体外也是可见的,可能会导致意外行为。
- 在for循环中使用let声明的变量在循环体内有块级作用域,不会在循环体外部可见
function example() {
for (var i = 0; i < 5; i++) {
// ...
}
console.log(i); // 输出 5,var 具有函数作用域
for (let j = 0; j < 5; j++) {
// ...
}
// console.log(j); // 报错,j 不在作用域内
}