零、块级作用域
在学习 let
和 const
之前,我们不得不谈一谈 ES5
的块级作用域,理解为什么要在 ES6
引入 let
和 const
。
我们都知道:通过 var
声明的变量存在变量提升的特性。 看看下面的示例代码:
if (condition) {
var value = 1;
}
console.log(value);
我们可能会觉得只有 condition
为 true
的时候,才会创建 value
,如果 condition
为 false
,程序就不会走到 if
里面,结果是程序报错:ReferenceError: value is not defined
。
但是,因为变量提升的原因,实际代码相当于:
var value;
if (condition) {
value = 1;
}
console.log(value);
如果 condition
为 false
,结果会是 undefined
。
除此之外,在 for
循环中:
function test() {
for (var i = 0; i < 3; i++) {
//...
}
console.log(i);
}
test();
即便循环已经结束了,我们依然可以访问 i
的值。
为了加强对变量生命周期的控制,ECMAScript 6
引入了块级作用域。
块级作用域存在于:
- 函数内部
- 块中(字符 { 和 } 之间的区域)