### JavaScript執行環境 是指在執行程式時,會維護一個執行環境(execution context),執行環境中會有一個`ThisBinding`儲存著`this`,告訴我們應該指向哪個物件。 執行環境可以想像成一間一間的工作室,每間工作室都有一個執行環境物件,負責記錄環境中需要用到的各種資料。當程式碼準備好開始運行,第一個建立的執行環境就是**全域執行環境**(Global execution context),又稱默認執行環境。 JavaScript只有在函數呼叫(Function call)發生時才會建立新的執行環境。 #### 執行緒語言(single threaded) 函數呼叫形成新的執行環境後。執行環境會相互堆疊,形成**執行堆疊**,具有**順序性**,越新的會放置越上方。 這是因為JavaScript是單執行緒程式語言,一次只能做一件事。 一開始會先進入global執行環境,接著會進入內層執行環境,執行還的堆疊會被釋放 (function 內的 return 即是完成),然後逐步的完成所有堆疊,將控制權還給全域執行環境 ### 作用域影響變數的宣告 * 全域變數:在函數外宣告的皆可稱為全域變數 瀏覽器的全域變數是`window` 下面變數所宣告的值都會產生在`window`內 ```javascript! var mon = "媽媽"; mon = "老媽"; ( function(){ mon = "老媽"; } )() ``` 以上方式都可以在 console.log(window); 後找到 `mom 這個變數,這個變數也屬於 全域物件,因此所有函式也都能取用此變數。 #### 變數與記憶體的關係 使`var`宣告一個變數時,記憶體會間準備一個空間給變數,所以在程式執行時未宣告變數不會出現錯誤,只會出現 `undefined `(已經有記憶體空間,但沒有值)。 ```javascript! console.log(mom); // undefined var mom = '老媽'; ``` 但如果沒有使用 var,則會跳出錯誤。 ```javascript! console.log(mom); // mom is not defined mom = '老媽'; ``` ### 事件佇列(Event queue ) JavaScript 在執行某些事件時,像是 `setTimeout`, `addEventListener`, `XMLHttpRequest` 等等,會將一個一個放進堆疊事件在後台運行,等待是件完成後將結果回傳至堆疊,並將**等待所有的事件堆疊完成後**,才可以讓`event queue`的事件觸發。 資料會依照[資料類型](https://)而決定要儲存在Heap 或 Stack 來影響事件佇列