差异有两点
- 变量提升
- 作用域
变量提升
变量提升让我们的代码变得丑陋
console.log(a) //undefined
var a = 1
暂时性死区
// 你说`let`没有变量提升吧,但是他又打印不出1
// 你说`let`有变量提升吧,它又报错了
// 我们将这种现象称之为`暂时性死区`
var a = 1
function f() {
console.log(a) // error:
let a = 2
}
f()
块级作用域
举例
用var声明的变量没有块级作用域
for (var i = 0; i < 5; i++) {}
console.log(i); // 5
上面代码等同于下面写法,带来全局污染
var i
for (i = 0; i < 5; i++) {}
console.log(i);// 5
用let声明的变量有块级作用域避免了全局污染
for (let i = 0; i < 5; i++) {}
console.log(i); // undefind
实际应用: 循环陷阱
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = () => console.log(i);
}
arr[1]();//5
arr[3]();//5
var arr = [];
for (let i = 0; i < 5; i++) {
arr[i] = () => console.log(i);
}
arr[1]();//1
arr[3]();//3