ES6 let新增块级作用域的概念。看下列代码:
1 {
2 let a=1;
3 {
4 let a = 6;
5 }
6 console.log(a);//1
7 }
8 {
9 var a=1;
10 {
11 var a = 6;
12 }
13 console.log(a);//6
14 }
上述代码存在两个块级作用域,他们之间互不影响,所以打印出来的结果为1,如果换成var,由于var不存在块级作用域的概念,打印出来的结果为6。从第二个打印出的结果可以发现在写代码的时候,如果重复命名,由于不存在块级作用域会导致结果受到影响,块级作用域的出现在一定程度上也是为了解决这种问题。
块级作用域和函数声明
1 function f() { console.log('外部'); }
2
3 (function () {
4 if (false) {
5 function f() { console.log('内部'); }
6 }
7 f();//f is not a function
8 }());
9
10 (function () {
11 function f() { console.log('内部'); }
12 f();//内部
13 }());
首先我们要明白函数声明他类似于var,他会提升到所在块级作用域的头部(这里有点像var的变量提升),所以第一个代码运行会报错,等同于下述代码
function f() { console.log('外部'); }
(function () {
var f;
if (false) {
function f() { console.log('内部'); }
}
f();//f is not a function
}());
ES6的块级作用域必须存在大括号,如果不存在大括号,Javascript不认为它是块级作用域,比如有时候我们在写if语句的时候会进行简写,如下:
if (true) let x = 1;// Lexical declaration cannot appear in a single-statement context
if (true) {
let x = 1;//正常
}
第一个不存在大括号,所以代码认为let为外部声明,就报了如下的错误。