建立執行環境的第一階段「創造階段」,會在全域環境裡產生一個全域物件及一個特殊的變數 this
;如果有外部環境,也會產生連結到外部環境的連結;以及「提昇」(hositing) 的特殊現象,為函數及變數在記憶體裡建立空間,此時變數的初始值被設定為 undefined
。
1 | var a; |
在瀏覽器查詢的結果會是 undefined
undefined
是什麼意思呢?undefined
其實是一種 Javascript 內建特殊的值,表示這個變數還沒被設定值。我們可以用以下範例來檢查這個特殊值的存在:
1 | var a="hello world"; |
變數 a
的值確實是 undefined,因為當執行環境被創造時,會設定所有的變數的初始值為 undefined。
這和從未宣告變數不同,假使去掉宣告關鍵字 var
1 | console.log(a); |
上圖顯示:產生錯誤,a is not defined。兩者的差異是什麼呢? 因為變數未被宣告,因此出現「無法參照」的錯誤。這是因為創造執行環境的創造階段,沒有找到var a
,所以它從未在記憶體中出現過。所以對於電腦來說,執行這段程式碼之後回應「我沒有在記憶體中找到 a 這個值」。
當我宣告 var a
,a
在創造階段就被放進記憶體,執行環境把 var a
放進記憶體,所以雖然我們沒有給變數一個值,Javascript 已經在底層完成許多工作。
所以 undefined
並不代表空的或還沒定義、不存在,事實上是「一種會佔據記憶體空間的值」,表示這是 Javascript 設定的初始值,
為了方便學習記憶,也可以稱為「未設定」(not set)
雖然我們可以給變數一個 undefined 的值,但永遠不要如此設定變數
1 | var a = "hello world"; |
雖然這在 Javascript 裡是有效的,但最好把這個特殊的值,留給 Javascript 的原始設定,以避免這種混淆的危險。因為如果濫用 undefined
,會無法分辨是自己設定的還是 Javascript 所設定的。最好讓 undefined
永遠表示「我從未設定這個值」,這對除錯將有相當大的幫助。