在先前的『Day-06 始於足下:基本語法、陳述句與宣告』一文中,曾經介紹JavaScript的不同宣告法。鑑於var宣告的作用域(影響範圍)太大,如今更傾向使用let(宣告變數)、const(宣告常數)。
而且,這兩種新宣告法共享一種特性,稱為「暫時死區(Temporal Dead Zone, TDZ)」。
新舊宣告法主要區別,計有:
此時,這個ReferenceError的狀態,意味著暫時無法讀取,此一「宣告變數、直到變數可以存取之間」的階段,就是TDZ。透過此一規則設計,可以敦促使用者端正習慣,養成(變數)先宣告再使用的規範。
話雖如此,並不是完全否定var宣告的使用。鑑於其作用域大、變數提昇、可重複宣告的獨特性,在必要情況下,仍無法被let/const宣告所完全取代。
本系列為文一直使用「全域變數」、「區域變數」的便利稱呼,但嚴格上JavaScript並無「全域變數」,而是「全域物件」。在node.js中,全域物件叫 global。在瀏覽器中,全域物件叫 window。換言之,我們常用的console.log 的全名應該叫 window.console.log。
如前所述,var宣告的作用域為函式,再如前文所述,函式中沒有var宣告的變數,就會變成「全域(效果的)變數」。在實務使用中,務必多加注意。