js執行上下文與執行上下文棧

在瞭解js的執行上下文對象與執行上下文棧之前,我們要先了解兩個概念 即變量提升跟函數提升

    變量提升 : 通過var定義的變量,在定義語句之前我們就可以直接訪問到,不過它的值是undefined

    函數提升:  通過function定義的函數,在函數定義語句前,我們就可以直接調用

    變量提升與函數提升都是js引擎的預處理產生的 ,先是變量提升,然後纔是函數提升.

 

  執行上下文對象

    全局執行上下文:  ( 確定執行上下文對象==>預處理==>執行代碼 )

      1. 在執行全局代碼前將window確定爲全局執行上下文對象

      2. 對全局數據進行預處理:

        對變量進行提升,值設置爲undefined.並添加爲window對象的屬性

        對函數進行提升並賦值.添加爲window對象的方法

        將this賦值爲window;

      3. 最後開始執行全局代碼

    

     函數執行上下分: ( 調用函數==>創建函數執行上下文對象==>預處理==>執行函數體 )

      1. 在調用函數,準備執行函數體代碼之前,創建對應的函數執行上下文對象  (虛擬的,存於棧中)

      2. 對局部數據進行預處理:

         把實參賦值給形參,添加爲該執行上下文對象的屬性

         變量提升

         函數提升

         把this賦值給調用該函數的對象

      3. 開始執行函數體代碼

 

   執行上下文棧  :   (爲了方便管理,js隱藏會創建一個棧來統一管理執行上下文對象)

     1.在全局代碼執行前,js引擎創建一個棧,用於管理所有的執行上下文對象

     2. 全局執行上下文對象(window)確定後,將其放入到棧中

     3. 調用函數時,會創建一個此函數的執行上下文對象,並放到棧中

     4. 函數執行完,js引擎會將其對應的執行上下文對象從棧中移除

     5. 所有的代碼執行完後,棧中只剩window

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