javascript中let和var的区别

Difference between let and var in JavaScript

本问题已经有最佳答案,请猛点这里访问。

我正在浏览Airbnb的javascript风格指南(https://github.com/airbnb/javascript)。

在第2.2节中,解释为

let是块范围的,而不是像var那样的函数范围。

1
2
3
4
5
6
7
8
9
10
11
// bad
var count = 1;
if (true) {
  count += 1;
}

// good, use the let.
let count = 1;
if (true) {
  count += 1;
}

我不明白为什么第一个练习不好,第二个练习不好,如果let和var都是块范围的,那么如果我使用它们中的任何一个,它有什么区别?

函数范围和块范围有什么区别?


当某个东西是块范围的,这意味着你可以更好、更直观地控制它的寿命。

例如

1
2
3
4
5
6
function a() {
    if (true) {
        var a = 7;
        let b = 42;
    }
}

var a在函数的范围内被拉出,而不是在if的块中进行隔离,如此;

1
2
3
4
5
6
7
function a() {
    var a;  // The JS compiler pulls the var out to this level
    if (true) {
        a = 7;
        let b = 42; // but keeps the let in this block.
    }
}

…这是违反直觉的,有时会导致问题——let没有这个问题。