2025年6月5日 星期四

[Javascipt] 宣告語法 var let const

  • 只有var未宣告,取值會給undefined,另外let、const,存取這些變數會導致 ReferenceError,此為「暫時性死區 (Temporal Dead Zone, TDZ)」的狀態
  • 三者差異比較:
特性 var (舊式) let (現代,可變) const (現代,常數)
作用域 (Scope) 函式作用域 (Function-scoped) 區塊作用域 (Block-scoped) 區塊作用域 (Block-scoped)
提升 (Hoisting) 會提升 (初始化為 undefined) 會提升 (但處於「暫時性死區」) 會提升 (但處於「暫時性死區」)
重新賦值 (Reassignment) 允許 允許 不允許
重複宣告 (Redeclaration) 允許 不允許 不允許
初始值 (Initial Value) 可選 可選 必須提供

var:

函式作用域: 在函式內宣告的 var 變數,整個函式都能存取。
提升: 變數宣告會被「提升」到作用域頂部,但初始值為 undefined。
允許重新賦值和重複宣告: 這可能導致意外的行為和錯誤。

let:

區塊作用域: 在任何 {} 區塊內宣告的 let 變數,只能在該區塊內存取。
提升 (暫時性死區): 變數宣告會被提升,但在程式碼執行到實際宣告行之前,嘗試存取會導致錯誤 (Temporal Dead Zone)。
允許重新賦值,但不允許重複宣告: 這是它與 var 的主要區別,有助於避免錯誤。

const:

區塊作用域: 與 let 相同,只能在宣告的區塊內存取。
提升 (暫時性死區): 與 let 相同。
不允許重新賦值: 宣告時必須賦予初始值,之後不能再改變其指向的值。
不允許重複宣告: 與 let 相同。

Scope: Like let, const is block-scoped.


function myFunction() {
  const PI = 3.14;
  if (true) {
    const GREETING = "Hello";
    Logger.log(GREETING); // Hello
  }
  Logger.log(PI); // 3.14
  // Logger.log(GREETING); // ReferenceError: GREETING is not defined
}

※ 重要注意事項: 如果 const 變數儲存的是物件或陣列,你不能將變數重新指向另一個物件或陣列,但你可以修改該物件的屬性或陣列的元素。

總結

優先使用 const: 如果變數的值在宣告後不會改變,請使用 const。這能讓程式碼更清晰、更安全。

當需要重新賦值時使用 let: 如果你預期變數的值會隨著時間改變 (例如迴圈計數器、暫存結果),則使用 let。

避免使用 var: 在現代 JavaScript 和 Google Apps Script 開發中,通常不建議使用 var,因為它的作用域和提升行為可能導致混淆和錯誤。