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文檔以及其他的一些相關文檔總結------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM