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为外部声明,就报了如下的错误。

posted @ 2022-10-09 16:26  奔跑的哈密瓜  阅读(158)  评论(0编辑  收藏  举报