---
# System prepended metadata

title: JavaScript的執行環境

---


### 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 來影響事件佇列