Javascript高級編程學習筆記(9)—— 執行環境

今天主要講一下,JS底層的一些東西,這些東西不太好舉例(應該是我水平不夠)html

望你們多多海涵,比心心web

 

執行環境

執行環境(執行上下文,全文使用執行環境 )是JS中最爲重要的一個概念,執行環境決定了,變量或函數有權訪問的其餘數據,並決定了其各自行爲。編程

跟執行環境直接相關的是變量對象 數組

JS在執行環境中定義的全部變量和函數都保存在該對象上。瀏覽器

對於該對象,咱們沒法使用代碼來進行訪問,可是JS解析器在進行數據處理時會在後臺對該變量對象進行訪問。數據結構

 

全局執行環境

全局執行環境是JS代碼的最外圍的執行環境,在JS腳本執行時建立,腳本執行完成後銷燬編程語言

全局執行環境根據宿主環境(即JS的運行環境)的不一樣而有所區別函數

在web瀏覽器中全局執行環境被認爲是window對象,因此全部的全局變量、函數都是做爲window對象的屬性和方法建立的(Es6中的 let、const聲明的變量不會做爲window對象的屬性和方法)this

執行環境中的全部代碼執行完成後保存在其中的全部變量、函數定義也都會隨之銷燬。spa

這也是this指針默認的指向

 

函數執行環境

每次進行函數的調用時,都會爲該函數建立一個新的執行環境,而後JS會執行該執行環境的代碼,具體規則一下子講述。

 

Eval函數執行環境

Eval函數可讓JS開發人員動態地生成,並執行腳本,傳入一個字符串後,會被該函數解析爲可執行的JS代碼,並執行

 

關於上述的執行環境的執行順序就涉及到了另外一個概念

執行棧

執行棧在其它的編程語言中一般被稱爲調用棧,執行棧中保存了代碼執行期間建立的全部執行環境

學過數據結構的朋友應該知道,棧是一個後進先出的結構

執行環境的執行順序以下:

1.當JS引擎首次讀取JS腳本時會建立全局執行環境,並將全局執行環境推入執行棧

2.每當函數被調用時,建立的函數執行環境會被推入執行棧,成爲執行棧 的棧頂元素,執行棧移交控制權給該執行環境

3.JS引擎會運行執行棧中棧頂的執行環境中的代碼

4.執行棧彈出已執行完的執行環境,將控制權交給目前棧頂的執行環境

5.彈出全局執行環境,瀏覽器關閉

 

我已經介紹了JS是如何管理執行環境的

下面我將介紹JS是如何建立執行環境的

 

建立執行環境

  1. 建立階段
    1. 肯定this的值,也被稱爲This Binding
      • 全局執行環境中,this指向全局對象
      • 瀏覽器中全局對象爲window
      • 函數執行環境中,this的值取決於函數的調用方式,若是被一個對象引用調用,this會指向該對象,不然this會設爲全局對象或undefined(嚴格模式)
    2. 詞法環境被建立
      • 詞法環境是一種規範類型,代碼的詞法嵌套結構來定義標識符與特定變量和函數關聯關係
      • 即詞法環境定義了標識符(變量名)和實際變量對象的映射關係(即JS是怎樣經過變量名訪問到數據的
      • 詞法環境有兩個組成部分:
        1. 環境記錄(儲存變量和函數聲明的實際位置)
          • 聲明性環境記錄(儲存變量、函數、參數 ;函數詞法環境包含該類記錄)
          • 對象環境記錄(儲存全局環境中出現的函數和變量的關聯 ; 全局詞法環境包含該類記錄)
        2. 對外部環境引用(用於訪問外部的詞法環境
      • 詞法環境有兩種類型:
        1. 全局環境(沒有外部詞法環境,爲null)
        2. 函數環境(保存在函數中定義的變量)
      • PS.對於函數環境而言,環境記錄中包含了一個arguments 對象(是一個類數組對象)在上一篇文章中有着其較爲詳細的說明  
    3. 變量環境被建立
      • 也是一種詞法環境,包含詞法環境全部的屬性用於存儲 函數聲明、變量綁定
      • 在ES6中 使用 LexicalEnvironment(詞法環境) 來儲存(let、const)
      • VariableEnvironment (變量環境) 組件存儲(var)
    • PS . JS中的變量提高正是變量環境引發的,在建立階段函數聲明被存儲在環境中,變量被設置爲undefined(因爲建立階段在執行階段以前)因此var 聲明的變量在聲明以前就能夠訪問,其值爲變量環境設置的undefined 
  2. 執行階段
    •   這一階段就很好理解了,在這一階段完成對變量的初始化,而後執行代碼
    •        PS. 若是JS在代碼中的環境記錄中保存的實際位置找不到 let ,那麼將會爲該值分配 Undefined

    

上述過程你們能夠參照下圖,可能不太準確但仍是能夠幫助你們理解

 

 

執行環境的內容大概就是這些,明天更新做用域、做用域鏈相關內容

相關文章
相關標籤/搜索