JavaScript中let和var的区别

7
我正在阅读 Airbnb 的 JavaScript 风格指南(https://github.com/airbnb/javascript)。
第 2.2 节解释了 let 是块级作用域,而不像 var 是函数级作用域。
// bad
var count = 1;
if (true) {
  count += 1;
}

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

我不理解为什么第一个是不好的做法,第二个是不好的做法,如果let和var都是块级作用域,使用其中任意一个有何区别?

另外,函数作用域和块级作用域有什么区别?


对我来说似乎有一个错误。应该在if语句中使用var和let才有意义。 - Yoann Augen
可能是重复的。请参见:https://dev59.com/pXRA5IYBdhLWcg3w9y50#11444416 - Filipe Borges
2
如果let和var都是块级作用域,则它们不是,这就是整个重点。 - Quentin
那个指南似乎在说永远不应该使用 var。 - forgivenson
我认为你误解了“let是块级作用域,而不像var一样是函数级作用域”的含义。更清晰的表述应该是“let是块级作用域,而var是函数级作用域”。 - JJJ
1个回答

4

当某些东西是块级作用域时,意味着您可以更好地控制其寿命,并以更直观的方式进行操作。

例如:

function a() {
    if (true) {
        var a = 7;
        let b = 42;
    }
}

变量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.
    }
}

这是有关 IT 技术的内容,有时候这可能和直觉相反且会导致一些问题 -- let 就不会出现这种问题。


在第一个例子中,a和b都不会在if块之外可见,在第二个例子中,由于你在if之外定义了a,所以它是可见的。但我仍然不理解函数作用域和块级作用域之间的区别。 - ankit
1
这个问题的答案非常好 - 建议你去看一下。链接 - Mingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接