js運行流程

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章