let&var

90 阅读1分钟

差异有两点

  • 变量提升
  • 作用域

变量提升

变量提升让我们的代码变得丑陋

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