---
# System prepended metadata

title: js執行環境

---

# js執行環境

每當函式執行時會生成一個環境，可看作一個泡泡
函式執行結束後，泡泡會跟著消失，意旨執行環境會消失
最外層的泡泡就會有一個全域物件-->window
node.js稱之為global
最外層宣告一個var a時，他實際是綁在window，因此
```javascript=
var a = 1;
console.log(a = window.a);
```
這邊會回傳一個布林值=>true

# call Stack

若在涵式內呼叫"自己"時，會發生一件事情=>遞迴(歸)，
他就會一直產生一個stack一直往上疊，若沒有控制好爆了，就會發生堆疊溢位(Stack Overflow)
(...怎麼這名詞這麼熟悉，~~求救網站~~)
run time(執行環境)有一些非同步的配套，解決單執行續的問題
例如ajax call api，若是回傳的資料量過大整個城市就會卡在那邊像d是當機一樣
```javascript=
console.log(1);
setTimeout(function () {
console.log(2);
}, 3000)
console.log(3);
```
執行結果 1 => 3 => 2

(js本身沒有計時器，js本身只提供一個入口交給瀏覽器or nodejs裡面去做)
所以setTimeout這個函式入口很快就執行完了，讀秒的事件則是放到後面

等於我們的函式都會先放到stack上執行，執行完後才會執行Event Queue
讀秒這件事情會放到事件柱列(Event Queue)執行

```javascript=
console.log('我就只是一段中文字');
setTimeout(function () {
    console.log('讓我執行啦QQ');
}, 0);
while (true) {
 // 我不做完你別想執行喔setTimeout
}
```
上方的程式碼因為js機制的關係，若是你堆疊的事件沒有執行完，永遠不會輪到Event Queue執行

物件導向

js本質上並沒有類別(what are u...)
他是使用protortype來設計物件導向
這邊做個淺淺的紀錄

```javascript=
function heroCreater(name, action) {
 //待實作
}

const allmight = new hreoCreater('歐爾麥特', '美國扣殺');
```
# 探討new做了什麼事情

前導觀念:
(1)js裡面所有的物件都有_proto_屬性
想要執行某個物件的方法時會順著_proto_找，物件本身沒有這個方法時，不會馬上爆炸
他會順著_proto_一路往它的末端去找-->稱之為原型鍊(Prototype Chain)
(真的找不到時還是會爆炸，就噴error 例如未定義之類的)

(2)js內函數本身也是個物件，每個函數(function)都含有prototype屬性
**註:prototype屬性和_proto_屬性不同喔!不要搞混了**

* 在泡泡內建立了一個空的物件
* 把這個空物件的_proto_屬性指向hreoCreater函數的prototype屬性
* 把泡泡裡的this指向這個剛建立的新物件

可以看到這個new做了蠻多的事情
20:20
