ES6-块级作用域

提供了块级作用域。

1
2
3
4
5
6
7
在`for`循环中,每一次循环,循环索引变量都是全新的变量,并且仅存在本次循环中。
for循环中,循环头是循环体的父作用域
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}

无暂时性提升,形成死区

let声明的变量,在声明前使用会报错,而不是像var一样得到undefined

1
2
3
4
5
6
7
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;

当外层和内层定义同名变量,在内层变量声明前调用该变量同样报错

1
2
3
4
5
6
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}

重复声明报错

同一个块级作用域内,使用letconst声明一个已存在的变量(无论第一次是如何声明的),报错

函数声明

ES6允许在块级作用域声明函数,但是为了兼容性,浏览器行为与规范有所不同

ES6:函数具有块级作用域

ES5(浏览器行为):函数提升到函数作用域最前。

使用函数赋值语句避免不同的行为差异