本文優先發表於ALPHAcamp
前言
這類問題我被問到不止一次。不得不說JS的變數蠻特別的。新手菜鳥會問,連老鳥也都常搞錯。
更甚者…近日更是聽到一個自稱有五年經驗的軟體工程師稱: var 宣告的變數是全域變數

我知道我身邊的朋友,也有不少可能不清楚,或是沒探究這麼深入,相關文章有但不多。
於是乎…感覺我再想拖延,也應該把這篇文章寫出來。
這篇文章對於你寫更好的JS並沒有太多幫助,有許多部分平常根本不太會用到。但卻是非常基礎的概念。儘管不知道,通常按照當前常見規範,程式碼亦不會太糟糕。
這篇文章主要是從一份回覆修改而來。
變數的生存範圍
無關鍵字賦值、var宣告、let宣告最大的差別在於生存區域的不同。無關鍵字賦值 - 這意味著全域變數的宣告,當然你在全域範圍使用var/let宣告也是全域的。只是無關鍵字可能引發意外的情況,像是你預期變數應該是函數區域的:
function printG(){
g = 1
console.log(`printG: `, g)
}
printG() // => printG: 1
console.log(`Global G:`, g) // => Global G: 1
上例中全域情況也取得到在printG函數裏定義的全域變數。這相當於你顯式定義g於全域: