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

參考文檔:   



       


       


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

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

  


  


 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能



※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享



※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選



※評比南投搬家公司費用收費行情懶人包大公開



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

留言