JS的執行過程

JS是腳本語言,但它也會通過編譯,編譯就發生在代碼執行前的極短期內(微妙級甚至更短)bash

編譯器進行代碼生成時,會建立執行上下文。函數

執行上下文

有三處代碼能夠建立執行上下文post

  • 全局代碼:執行全局代碼會建立全局執行上下文,有且只有一個全局執行上下文
  • 函數:執行函數會建立函數執行上下文
  • eval()函數:執行eval()函數會建立Eval函數執行上下文

執行上下文棧

這些上下文構成一個執行上下文棧,新的上下文會添加到棧的頂部,執行完則出棧,直到再次到達全局執行上下文。this

建立執行上下文的過程

每一個執行上下文有三個重要屬性:變量對象(Variable Object),做用域鏈(Scope chain)和thisspa

executionContextObj = {
  // 變量對象
  'variableObject': { /* function arguments / parameters, inner variable and function declarations */ },

  // 做用域鏈
  'scopeChain': { /* variableObject + all parent execution context's variableObject */ }, 'this': {} } 複製代碼

其建立過程以下指針

1)建立變量對象code

  • 建立 arguments 對象:建立 arguments 對象,該對象中包含實參,此過程僅在函數(非箭頭函數)中進行。
  • 函數聲明提高:每發現一個函數聲明,在變量對象中建立與函數名相同的屬性,值是指向這個函數的指針,若是這個函數名已存在,則重寫這個指針的值。
  • 變量聲明提高:每發現一個變量聲明,在變量對象中建立與變量名相同的屬性,值初始化爲undefined,若是變量名已存在,則什麼也不作。

2)創建做用域鏈cdn

做用域就是上面的變量對象,做用域鏈就是由當前執行上下文的變量對象與全部上層執行上下文的變量對象組成的帶頭結點的單向鏈表。對象

3)肯定this的指向blog

執行

執行過程當中最重要的就是事件循環

最後

歡迎關注個人微博@狂刀二

相關文章
相關標籤/搜索