let
到目前为止,我们知道 JavaScript 在暴露块作用域的功能中有一些奇怪的行为。如果仅仅 是这样,那么 JavaScript 开发者多年来也就不会将块作用域当作非常有用的机制来使用了。
幸好,ES6 改变了现状,引入了新的 let 关键字,提供了除 var 以外的另一种变量声明方式。
let 关键字可以将变量绑定到所在的任意作用域中(通常是 { .. } 内部)。换句话说,let 为其声明的变量隐式地了所在的块作用域
var foo = true;
if (foo) { let bar = foo * 2; bar = something( bar ); console.log( bar ); }
console.log( bar ); // ReferenceError
用 let 将变量附加在一个已经存在的块作用域上的行为是隐式的。在开发和修改代码的过 程中,如果没有密切关注哪些块作用域中有绑定的变量,并且习惯性地移动这些块或者将 其包含在其他的块中,就会导致代码变得混乱。
为块作用域显式地创建块可以部分解决这个问题,使变量的附属关系变得更加清晰。通常 来讲,显式的代码优于隐式或一些精巧但不清晰的代码。显式的块作用域风格非常容易书 写,并且和其他语言中块作用域的工作原理一致:
var foo = true;
if (foo) {
{ // <-- 显式的快
let bar = foo * 2;
bar = something( bar );
console.log( bar );
}
}
console.log( bar ); // ReferenceError
只要声明是有效的,在声明中的任意位置都可以使用 { .. } 括号来为 let 创建一个用于绑 定的块。在这个例子中,我们在 if 声明内部显式地创建了一个块,如果需要对其进行重 构,整个块都可以被方便地移动而不会对外部 if 声明的位置和语义产生任何影响。
但是使用 let 进行的声明不会在块作用域中进行提升。声明的代码被运行之前,声明并不 “存在”。
{
console.log( bar ); // ReferenceError!
let bar = 2;
}