- 只有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,因為它的作用域和提升行為可能導致混淆和錯誤。