ES6中的块级作用域与函数声明

  块级作用域
      
    定义:是一个语句,将多个操作封装在一起,通常是放在一个大括号里,没有返回值。
    为何需要块级作用域?
     
    在ES6之前,函数只能在全局作用域和函数作用域中声明,不能在块级作用域中声明。没有块级作用域导致很多场景不合理:
  
    function block(){
        var a = 1;
        if(true){
            var a = 2;
        }
        console.log(a)   //2
    }
    block()


    function block(){
        let a = 1;
        if(true){
            let a = 2;
        }
        console.log(a)    //1
    }
    block()
    上面的函数有两个代码块,都声明了变量a,运行后输出 1。这表示外层代码块不受内层代码块的影响。如果两次都使用var定义变量a,最后输出的值才是 2
  
  
  ES6中的块级作用域:
      1、允许块级作用域任意嵌套,外层作用域无法读取内层作用域的变量
  {{{{  
      {let i = 6;}  
      console.log(i);  // 报错  
  }}}}  
        上面代码使用了一个五层的块级作用域,每一层都是一个单独的作用域。第四层作用域无法读取第五层作用域的内部变量。
 
      2、内层作用域可以定义外层作用域的同名变量
    
    {{{{  
        let i = 5;  
        {let i = 10;}
        console.log(i)  //5  
    }}}} 

    {{{{  
        let i = 5;  
        {
            let i = 10;
            console.log(i) //10
         }          
    }}}}  
      
  3、不需要立即执行匿名函数
     立即执行函数:   
(function() {
      var  a = 0;
}());

  块级作用域:

  {
     var a = 0;
  }
    
 块级作用域中的函数声明
    运行环境:ES6浏览器。
    可实现的行为:
    1、允许在块级作用域内声明函数
    2、函数声明类似于var, 即会提升到全局作用域或函数作用域的头部
    3、函数声明还会提升到所有块级作用域的头部
  
function Func() {  
     console.log('outside');  
}  
(function() {  
     var Func = undefined;  
     if (false) {  
          function Func() {  
              console.log('inside');  
          }  
     }  
   Func();  
})();  //报错
    考虑到环境导致的差异太大,应该避免在块级作用域中声明函数,如果需要,应该写成函数表达式的形式,而不是函数声明语句
let Func= function Func() {  
       console.log('inside');  
}; 
Func()
    
 ES6的块级作用域允许声明函数的规则只在使用大括号的情况下成立:
'use strict'  
    if (true) {  
        function Func1() {} // 不报错  
    }  
    if (true)  
        function Func2() {} // 报错  
 
 
 
-----------------从今天开始不定期连载ES6,主要是根据阮一峰的ES6文档以及其他的一些相关文档总结------------------
原文地址:https://www.cnblogs.com/shy0113/p/11851370.html