### JS的預處理階段
上述將的是解釋器的整體過程,這里再提下在正式執行JS前,還會有一個預處理階段 (譬如變量提升,分號補全等)
預處理階段會做一些事情,確保JS可以正確執行,這里僅提部分:
#### 分號補全
JS執行是需要分號的,但為什么以下語句卻可以正常運行呢?
```
console.log('a')
console.log('b')
```
原因就是JS解釋器有一個 [Semicolon Insertion](http://inimino.org/~inimino/blog/javascript_semicolons) 規則,它會按照一定規則,在適當的位置補充分號
譬如列舉幾條自動加分號的規則:
- 當有換行符(包括含有換行符的多行注釋),并且下一個 `token` 沒法跟前面的語法匹配時,會自動補分號。
- 當有 `}` 時,如果缺少分號,會補分號。
- 程序源代碼結束時,如果缺少分號,會補分號。
于是,上述的代碼就變成了
```
console.log('a');
console.log('b');
```
所以可以正常運行
當然了,這里有一個經典的例子:
```
function b() {
return
{
a: 'a'
};
}
```
由于分號補全機制,所以它變成了:
```
function b() {
return;
{
a: 'a'
};
}
```
所以運行后是`undefined`
#### 變量提升
一般包括函數提升和變量提升
譬如:
```
a = 1;
b();
function b() {
console.log('b');
}
var a;
```
經過變量提升后,就變成:
```
function b() {
console.log('b');
}
var a;
a = 1;
b();
```
這里沒有展開,其實展開也可以牽涉到很多內容的
譬如可以提下變量聲明,函數聲明,形參,實參的優先級順序,以及es6中let有關的臨時死區等
- 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