在 JavaScript 中,暫存死區 (Temporal Dead Zone,TDZ) 是指在程式碼塊中,變數在宣告之前無法被訪問的一段區域。它發生在使用 let
和 const
宣告變數時,從塊的開始到變數宣告語句之間的區域。var
宣告的變數不存在 TDZ。
理解 TDZ 的核心在於 JavaScript 的變數提升和初始化階段:
-
變數提升 (Hoisting): 使用
var
宣告的變數會被提升到作用域的頂部,並初始化為undefined
。而使用let
和const
宣告的變數也會被提升,但不會被初始化。它們處於一種“未初始化”的狀態。 -
初始化:
let
和const
變數的初始化發生在程式碼執行到宣告語句時。在初始化之前,訪問這些變數就會導致ReferenceError
,這就是 TDZ。
示例:
function example() {
console.log(x); // ReferenceError: Cannot access 'x' before initialization
let x = 10;
console.log(x); // 10
console.log(y); // undefined
var y = 20;
console.log(y); // 20
}
example();
TDZ 的運用場景:
雖然 TDZ 看起來像是一個限制,但它實際上有助於編寫更清晰、更可預測的程式碼:
-
避免意外使用未初始化的變數: TDZ 能夠防止在變數宣告之前意外使用它,從而避免一些難以除錯的錯誤。例如,在迴圈中使用
let
宣告計數器,可以避免計數器在迴圈外部被意外訪問或修改。 -
更早發現錯誤: TDZ 可以幫助開發者在開發早期就發現程式碼中的錯誤,而不是等到執行時才發現。
-
促進塊級作用域的使用: TDZ 鼓勵開發者使用塊級作用域,從而提高程式碼的可讀性和可維護性。
-
類中屬性的初始化順序: 在類中,TDZ 確保了屬性在建構函式中被正確初始化。嘗試在建構函式中呼叫
super()
之前訪問this
上的屬性會導致錯誤,因為這些屬性尚未初始化。
class MyClass {
constructor(value) {
// console.log(this.myProp); // ReferenceError: Cannot access 'myProp' before initialization
this.myProp = value;
console.log(this.myProp); // 正確輸出 value
}
}
總結:
TDZ 是 JavaScript 中一個重要的概念,它有助於提高程式碼的可靠性和可預測性。理解 TDZ 的原理和運用場景,可以幫助開發者編寫更健壯的 JavaScript 程式碼。