1. 程式人生 > >ES6學習筆記01 -- 暫時性死區 ( temporal dead zone )

ES6學習筆記01 -- 暫時性死區 ( temporal dead zone )

參考文件:  let 和 const 命令 - ECMAScript6入門 

       暫時性死區(temporal dead zone)

       理解ES6中的TDZ(暫時性死區)

       ES6 中 let 暫時性死區詳解

注:文中程式碼僅作示意,複製執行時需要適當調整

  ES6 規定,如果程式碼區塊中存在 let 和 const 命令宣告的變數,這個區塊對這些變數從一開始就形成了封閉作用域,直到宣告語句完成,這些變數才能被訪問(獲取或設定),否則會報錯ReferenceError。這在語法上稱為“暫時性死區”(英temporal dead zone,簡 TDZ),即程式碼塊開始到變數宣告語句完成之間的區域。   通過 var 宣告的變數擁有變數提升、沒有暫時性死區,作用於函式作用域:
    • 當進入變數的作用域(包圍它的函式),立即為它建立(繫結)儲存空間,立即被初始化並被賦值為 undefined   
    • 當執行到變數的宣告語句時,如果變數定義了值則會被賦值
    (function fn() {  //函式作用域開始
        console.log(temp)  //undefined
        //宣告
        var temp 
        console.log(temp)  //undefined
        //賦值
        temp = 123
        console.log(temp)  //123
    })()
    //在函式作用域外訪問
    console.log(temp)  //ReferenceError: temp is not defined

 

  通過 let 宣告的變數沒有變數提升、擁有暫時性死區,作用於塊級作用域:

    • 當進入變數的作用域(包圍它的語法塊),立即為它建立(繫結)儲存空間,不會立即初始化,也不會被賦值
    • 訪問(獲取或設定)該變數會丟擲異常 ReferenceError
    • 當執行到變數的宣告語句時,如果變數定義了值則會被賦值,如果變數沒有定義值,則被賦值為undefined
        {  //函式作用域開始,TDZ開始
            console.log(temp)  //ReferenceError: temp is not defined
            //宣告
            let temp  
            console.log(temp)  //ReferenceError: Cannot access 'temp' before initialization
            //賦值
            temp = 345  //TDZ結束
            console.log(temp)  //345
            //塊級作用域結束
        }
        //在塊級作用域外訪問
        console.log(temp)  //ReferenceError: temp is not defined

 

  通過 const 宣告的常量,需要在定義的時候就賦值,並且之後不能改變,暫時性死區與 let 類似。

        {   //作用域開始,TDZ開始
            console.log(temp)  //ReferenceError: temp is not defined
            //宣告並賦值
            const temp = 789  //TDZ結束
            console.log(temp)  //789 
            //給常量賦值
            temp = 987  //TypeError: Assignment to constant variable
            //作用域結束
        }   
        //在作用域外訪問
        console.log(temp)  //ReferenceError: temp is not defined

 

  一句話總結:在塊級作用域中, let 和 const 宣告的變數、常量在宣告語句執行完成之前不能訪問(包括宣告語句本身)。   另外,容易因為 暫時性死區 而出錯的細節程式碼在此不展開舉例,參考文件中有詳情舉例。     附:第一次寫學習筆記,寫隨筆花費的時間比學習相關內容的時間還要長,感覺有點本末倒置,不過以後回頭看應該會覺得有所值得吧!