iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

追憶JS年華系列 第 13

Day-13 觀念補遺:TDZ與全域變數

在先前的『Day-06 始於足下:基本語法、陳述句與宣告』一文中,曾經介紹JavaScript的不同宣告法。鑑於var宣告的作用域(影響範圍)太大,如今更傾向使用let(宣告變數)、const(宣告常數)。

而且,這兩種新宣告法共享一種特性,稱為「暫時死區(Temporal Dead Zone, TDZ)」。

暫時死區TDZ

新舊宣告法主要區別,計有:

  • var宣告的作用域為函式(function);let/const宣告為區塊(block)(如 { })。
  • 使用變數前沒有先宣告:後宣告var會出現undefined(變數提昇,如前文);後宣告let/const則會斷定為錯誤(ReferenceError)。

此時,這個ReferenceError的狀態,意味著暫時無法讀取,此一「宣告變數、直到變數可以存取之間」的階段,就是TDZ。透過此一規則設計,可以敦促使用者端正習慣,養成(變數)先宣告再使用的規範。

話雖如此,並不是完全否定var宣告的使用。鑑於其作用域大、變數提昇、可重複宣告的獨特性,在必要情況下,仍無法被let/const宣告所完全取代。

全域變數/區域變數

本系列為文一直使用「全域變數」、「區域變數」的便利稱呼,但嚴格上JavaScript並無「全域變數」,而是「全域物件」。在node.js中,全域物件叫 global。在瀏覽器中,全域物件叫 window。換言之,我們常用的console.log 的全名應該叫 window.console.log。

如前所述,var宣告的作用域為函式,再如前文所述,函式中沒有var宣告的變數,就會變成「全域(效果的)變數」。在實務使用中,務必多加注意。


上一篇
Day-12 函式與變數
下一篇
Day-14 傳值與傳址
系列文
追憶JS年華30

尚未有邦友留言

立即登入留言