var 声明的变量作用域不是块级的,会扩大变量的作用域,可能造成变量污染。 let 声明的变量作用域就更精确,离开作用域变量就销毁。 const 顾名思义就是常量了。 变量作用域更加精准 不用担心变量作用域自动提升,造成上一级或全局变量值被覆盖。 举个栗子:

1
2
3
4
5
6
7
8
let a = 1;
var b = 1;
if (true) {
let a = 2;
var b = 2;
}
console.log(a) // 输出 1
console.log(b) // 输出 2

变量作用域可控性更好 let 的作用域是根据代码块(enclosing block)来判定的,而 var 的作用域是根据函数块(function block)来判定的。这样的话,如果我们的变量都使用 let/const 来声明,那么以前的立即执行函数就不需要了,我们只要加一个代码块就好了。 举个栗子:

1
2
3
4
{
let a = 1;
}
console.log(a) // 输出 a is not defined

Runtime自动检查重复声明的函数并报错 在同一个作用域内不允许重复声明变量。 举个栗子:

1
2
3
4
if (true) {
let a = 1;
let a = 2;
}

Runtime会报错:Uncaught SyntaxError: Identifier ‘a’ has already been declared 有了更加清晰的作用域,我们的代码就能够更好被预测,也更好维护。 有了更容易控制的作用域可以让我们减少很多立即执行的函数。 Runtime的自动检查可以避免不必要,甚至是错误的代码声明。