2.块级作用域(ES6阮一峰学习记录)
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为外部声明,就报了如下的错误。