ES6學習筆記01 -- 暫時性死區 ( temporal dead zone )
阿新 • • 發佈:2019-11-17
參考文件: 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 宣告的變數、常量在宣告語句執行完成之前不能訪問(包括宣告語句本身)。 另外,容易因為 暫時性死區 而出錯的細節程式碼在此不展開舉例,參考文件中有詳情舉例。 附:第一次寫學習筆記,寫隨筆花費的時間比學習相關內容的時間還要長,感覺有點本末倒置,不過以後回頭看應該會覺得有所值得吧!