Skip to content

[javascript] outer environment 與 scope chain

Published: at 06:49 AM

最近看到相關文章才釐清這個觀念,來記錄一下


因為在 javascript 中我們可不宣告變數直接使用,所以我們來看看以下這段程式碼

[javascript] function b() { console.log(variable); } function a() { var variable=2; b(); } var variable=1; a(); // 1 [/javascript]

以前我都以為會印出2,沒想到是印出1 XD

首先我們先看一下程式碼執行的 stack 狀態,我們的函式呼叫 global => a() => b() ,因此會產生三個 context。

紅色線則代表此 context 的 outer environment

Untitled Diagram

當今天context 中不含有此變數時,就會去 outer environment 尋找此變數,引次剛剛那個例子會印出 1。

簡單來看如何判斷 outer envirment,也就是以程式碼的自動縮排後的結果。同一層縮排的 outer nevironment 就是相同的。

那 scope chain 指的是什麼呢? 其實也就是指在一層一層的往上找變數的這個過程的這條鍊。

比如以下這個例子:

[javascript] function a() { function b() { console.log(variable); } var variable=2 b(); } var variable=1; a(); b(); // 2 // b is not defined [/javascript]

以上這段程式碼,我們先從 global 開始看

scope chain 也就是指像剛剛在 b() context => a() context => global context 尋找變數的一條鍊

參考資料:

https://pjchender.blogspot.tw/2015/12/javascriptscope-chainouter-environment.html