JavaScript 中 let 和 var 的区别

ank*_*kit 6 javascript

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

在第 2.2 节中解释了

let 是块作用域的,而不是像 var 那样的函数作用域。

// bad
var count = 1;
if (true) {
  count += 1;
}

// good, use the let.
let count = 1;
if (true) {
  count += 1;
}
Run Code Online (Sandbox Code Playgroud)

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

函数作用域和块作用域之间有什么区别?

小智 4

当某些东西是块作用域时,这意味着您可以更好、更直观地控制生命周期

例如

function a() {
    if (true) {
        var a = 7;
        let b = 42;
    }
}
Run Code Online (Sandbox Code Playgroud)

var a 在函数范围内被拉出,而不是在 if 块中隔离,就像这样;

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

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