js引擎處理js的過程同傳統編譯語言的代碼編譯大致相同
流程
步驟 | 傳統編譯語言 | JS引擎 |
---|---|---|
1 | 詞法/語法分析 | 詞/語法分析 |
2 | 解析生成AST | 解析生成AST |
3 | 代碼生成 | 預編譯 |
4 | 執行 | 執行 |
預編譯階段
js代碼是運行時編譯(編譯發生在代碼執行前幾微秒),即預編譯完立即執行。預編譯階段進行初始化執行上下文
聲明提升
- 初始化上下文時有變量聲明,先去作用域鏈查找是否已存在,無則創建屬性並賦值undefined,有則不作處理
- 初始化上下文時有函數聲明,先去作用域鏈查找是否已存在,無則創建屬性並賦值函數,有則覆蓋
function a(b) {
console.log(b)
function b() {
console.log(b)
}
b()
}
a(2)
let、const阻止提升的原因
- 預編譯時,存在TDZ暫時性死區
- 遇到let,const聲明變量放入TDZ中
- 訪問變量時,若存在TDZ中,則報錯
- 執行聲明後,從TDZ中移除
var a =1
function fun() {
console.log(a)
let a =1
}
console.log(a)
fun()
LHS與RHS查找類型
- LHS
a = 1
- RHS
console.log(a)
console.log(a)
b = 1