### JS的執行階段
解釋器解釋完語法規則后,就開始執行,然后整個執行流程中大致包含以下概念:
- 執行上下文,執行堆棧概念(如全局上下文,當前活動上下文)
- VO(變量對象)和 AO(活動對象)
- 作用域鏈
- this 機制等
**執行上下文簡單解釋**
- JS 有 `執行上下文`
- 瀏覽器首次載入腳本,它將創建 `全局執行上下文`,并壓入執行棧棧頂(不可被彈出)
- 然后每進入其它作用域就創建對應的執行上下文并把它壓入執行棧的頂部
- 一旦對應的上下文執行完畢,就從棧頂彈出,并將上下文控制權交給當前的棧。
- 這樣依次執行(最終都會回到全局執行上下文)
譬如,如果程序執行完畢,被彈出執行棧,然后有沒有被引用(沒有形成閉包),那么這個函數中用到的內存就會被垃圾處理器自動回收

然后執行上下文與VO,作用域鏈,this的關系是:
每一個執行上下文,都有三個重要屬性:
- 變量對象 (`Variable object,VO`)
- 作用域鏈 (`Scope chain`)
- `this`

**VO 與 AO**
VO 是執行上下文的屬性(抽象概念),但是**只有全局上下文的變量對象允許通過VO的屬性名稱來間接訪問(因為在全局上下文里,全局對象自身就是變量對象)**
AO(`activation object`),當函數被調用者激活,AO就被創建了
可以理解為:
- 在函數上下文中:`VO === AO`
- 在全局上下文中:`VO === this === global`
總的來說,VO中會存放一些變量信息(如聲明的變量,函數,`arguments`參數等等)
**作用域鏈**
它是執行上下文中的一個屬性,原理和原型鏈很相似,作用很重要。
譬如流程簡述:
```
在函數上下文中,查找一個變量foo
如果函數的VO中找到了,就直接使用
否則去它的父級作用域鏈中(__parent__)找
如果父級中沒找到,繼續往上找
直到全局上下文中也沒找到就報錯
```

**this指針**
這也是JS的核心知識之一,特別注意:**this是執行上下文環境的一個屬性,而不是某個變量對象的屬性**
因此:
- this 是沒有一個類似搜尋變量的過程
- 當代碼中使用了this,這個 this的值就直接從執行的上下文中獲取了,而不會從作用域鏈中搜尋
- this的值只取決中進入上下文時的情況
所以經典的例子:
```js
var baz = 200;
var bar = {
baz: 100,
foo: function() {
console.log(this.baz);
}
};
var foo = bar.foo;
// 進入環境:global
foo(); // 200,嚴格模式中會報錯,Cannot read property 'baz' of undefined
// 進入環境:global bar
bar.foo(); // 100
```
就要明白了上面 this 的介紹,上述例子很好理解
- Web 開發筆記
- 從輸入 URL 到頁面加載完成的過程中都發生了什么事情?
- 從瀏覽器接收url到開啟網絡請求線程
- 開啟網絡線程到發出一個完整的http請求
- 從服務器接收到請求到對應后臺接收到請求
- 后臺和前臺的http交互
- http的緩存
- 解析頁面流程
- HTML解析,構建DOM
- CSS解析,構建CSSOM
- 資源外鏈的下載
- CSS的可視化格式模型
- 包含塊(Containing Block)
- 控制框(Controlling Box)
- BFC(Block Formatting Context)
- IFC(Inline Formatting Context)
- 其它
- JS引擎解析過程
- JS的解釋階段
- JS的預處理階段
- JS的執行階段
- 回收機制
- 參考資料
- JavaScript模塊化編程
- AMD
- requireJS
- CommonJS
- UMD
- ES6模塊
- 參考資料
- 使用 JavaScript 實現一門編程語言
- 如何使用 JavaScript 實現一門編程語言(1) —— 前言
- 如何使用 JavaScript 實現一門編程語言(2) —— 編寫一個解析器
- 如何使用 JavaScript 實現一門編程語言(3) —— Input stream
- 如何使用 JavaScript 實現一門編程語言(4) —— Token stream
- 如何使用 JavaScript 實現一門編程語言(5) —— AST
- 如何使用 JavaScript 實現一門編程語言(6) —— Interpreter
- 完整代碼
- 參考資料
- 前端布局概論
- 參考資料
- Windows 筆記
- 錯誤解決
- win10應用商店無法登錄提示0x80070426解決方法
- 使用技巧
- 設置 Hyper-V 和 VMware 共存
- Powershell
- WSL