想像你在寫一份「說明書」,正常來說你會一行一行往下看對吧?
但 JavaScript(瀏覽器跑的程式語言)在讀你寫的程式時,它會先偷偷把「宣告」的東西放到最上面,這個動作叫做:
Hoisting(提升)= 變數或函式被提到最上面
你寫的原始程式是:
console.log(x); // 印出什麼?
var x = 10;
你可能會以為它會錯誤,因為 x 還沒被設定。
但實際上 JavaScript 會先偷偷幫你做這件事:
var x; // 提升上來了!
console.log(x); // 印出 undefined
x = 10;
所以結果是:
undefined ✅(沒有錯誤)
let 呢?console.log(y);
let y = 20;
這次就會出錯:
❌ ReferenceError: y is not defined
因為 let 雖然也會被提升,但它不會馬上給你用,會有一段 「死區」(叫 TDZ),在這段時間你不能用它。
| Hoisting 特色 | 好處 😃 | 壞處 😨 |
|---|---|---|
var 會被提升 |
不會出錯,程式可以繼續跑 | 你以為有值,其實是 undefined |
let / const 也會被提升 |
比較安全,不會讓你用錯變數 | 如果你不懂會誤以為是語法錯誤 |
| 函式(function)會提升 | 可以先使用函式(很好) | 有時候搞不清楚哪裡是先哪裡是後 |
var 的行為像這樣:我說:請幫我拿書!
系統看:你有說 var 書,但還沒寫書內容,先給你一個空的書!
結果:我拿到空的書,沒出錯。
結果是 undefined
let 的行為像這樣:我說:請幫我拿雜誌!
系統看:你說 let 雜誌,但我還沒準備好,不能給你!
結果:錯誤!你太早要求了!
結果是錯誤!
| 你用的關鍵字 | 能不能先用? | 發生什麼事? |
|---|---|---|
var |
✅ 可以先用 | 但結果是 undefined,可能出錯 |
let / const |
❌ 不能先用 | 馬上報錯,讓你知道你用錯時間了 |
function |
✅ 可以先用 | 好處是你能先呼叫函式 |
var 像是會答應你,但給你空東西let / const 像是還沒準備好,不能先用function 是準備好可以先叫的功能