iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0

一般我們會先宣告完函數後才呼叫函數,
也會在宣告完變數與賦值後才透過 console.log 來查看變數內容,

也就是像以下這段程式碼:

var text = "我是一個字串型別的變數";

function eatRice() {
  console.log('吃飯');
}

eatRice();

console.log(text);

在 Chrome 開發者工具的 console 結果如下:

現在將程式碼改寫為以下:

console.log(text);

eatRice();

var text = "我是一個字串型別的變數";

function eatRice() {
  console.log('吃飯');
}

在 Chrome 開發者工具的 console 結果如下:

會看到將變數 text 輸出結果後出現 undefined, 而不是出現錯誤,
而且呼叫吃飯的 function 也能成功執行 function 內的程式碼,
為什麼會這樣呢?

原因是全域執行脈絡與其他執行脈絡產生時會經歷兩個階段,
第一個階段是創造階段,
當全域執行脈絡處於創造階段時 JavaScript 引擎除了創造全域物件、this 與外部環境之外,還會替每個變數與函數設置到各自的記憶體空間中:

每個變數與 function 之間都會有各自的記憶體空間.

在執行脈絡的創造階段 JavaScript 引擎會將整個宣告的 function 與 function 中的完整程式儲存到記憶體空間中,

要注意的是在執行脈絡的創造階段時,
JavaScript 引擎只會替變數在記憶體空間設置預設值 undefined,

接著在執行脈絡的第二階段(執行階段)時會逐行執行程式碼,

當開始執行第一行輸出變數 text 的程式碼時,
前面說過在執行脈絡的創造階段時 JavaScript 引擎只會替變數在記憶體空間設置預設值 undefined,
這也就是透過 chrome 開發者工具的 console 中輸出變數 text 的值時會得到 undefined 的原因,

要避免自己手動將變數的值設置為 undefined,
這樣可以在除錯時知道這是 JavaScript 引擎替變數設置的預設值,
也代表此變數從未賦值過的意思,
除錯起來會比較容易.


上一篇
執行脈絡(Execution context)與執行堆疊(Execution stack)
下一篇
Scope Chain
系列文
那些必須了解的 JavaScript 特性與寫程式前的思考17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言