🧠 什麼是 Hoisting?(提升)

想像你在寫一份「說明書」,正常來說你會一行一行往下看對吧?

但 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 好不好?

Hoisting 特色 好處 😃 壞處 😨
var 會被提升 不會出錯,程式可以繼續跑 你以為有值,其實是 undefined
let / const 也會被提升 比較安全,不會讓你用錯變數 如果你不懂會誤以為是語法錯誤
函式(function)會提升 可以先使用函式(很好) 有時候搞不清楚哪裡是先哪裡是後

🧪 小遊戲(你可以想像)

1. var 的行為像這樣:

我說:請幫我拿書!
系統看:你有說 var 書,但還沒寫書內容,先給你一個空的書!
結果:我拿到空的書,沒出錯。

結果是 undefined

2. let 的行為像這樣:

我說:請幫我拿雜誌!
系統看:你說 let 雜誌,但我還沒準備好,不能給你!
結果:錯誤!你太早要求了!

結果是錯誤!

📌 總結(不懂程式也能記住)

你用的關鍵字 能不能先用? 發生什麼事?
var ✅ 可以先用 但結果是 undefined,可能出錯
let / const ❌ 不能先用 馬上報錯,讓你知道你用錯時間了
function ✅ 可以先用 好處是你能先呼叫函式

✅ 建議你這樣記: