今天主要講一下,JS底層的一些東西,這些東西不太好舉例(應該是我水平不夠)html
望你們多多海涵,比心心web
執行環境(執行上下文,全文使用執行環境 )是JS中最爲重要的一個概念,執行環境決定了,變量或函數有權訪問的其餘數據,並決定了其各自行爲。編程
跟執行環境直接相關的是變量對象 數組
JS在執行環境中定義的全部變量和函數都保存在該對象上。瀏覽器
對於該對象,咱們沒法使用代碼來進行訪問,可是JS解析器在進行數據處理時會在後臺對該變量對象進行訪問。數據結構
全局執行環境是JS代碼的最外圍的執行環境,在JS腳本執行時建立,腳本執行完成後銷燬編程語言
全局執行環境根據宿主環境(即JS的運行環境)的不一樣而有所區別函數
在web瀏覽器中全局執行環境被認爲是window對象,因此全部的全局變量、函數都是做爲window對象的屬性和方法建立的(Es6中的 let、const聲明的變量不會做爲window對象的屬性和方法)this
執行環境中的全部代碼執行完成後保存在其中的全部變量、函數定義也都會隨之銷燬。spa
這也是this指針默認的指向
每次進行函數的調用時,都會爲該函數建立一個新的執行環境,而後JS會執行該執行環境的代碼,具體規則一下子講述。
Eval函數可讓JS開發人員動態地生成,並執行腳本,傳入一個字符串後,會被該函數解析爲可執行的JS代碼,並執行
關於上述的執行環境的執行順序就涉及到了另外一個概念
執行棧在其它的編程語言中一般被稱爲調用棧,執行棧中保存了代碼執行期間建立的全部執行環境
學過數據結構的朋友應該知道,棧是一個後進先出的結構
執行環境的執行順序以下:
1.當JS引擎首次讀取JS腳本時會建立全局執行環境,並將全局執行環境推入執行棧
2.每當函數被調用時,建立的函數執行環境會被推入執行棧,成爲執行棧 的棧頂元素,執行棧移交控制權給該執行環境
3.JS引擎會運行執行棧中棧頂的執行環境中的代碼
4.執行棧彈出已執行完的執行環境,將控制權交給目前棧頂的執行環境
5.彈出全局執行環境,瀏覽器關閉
我已經介紹了JS是如何管理執行環境的
下面我將介紹JS是如何建立執行環境的
上述過程你們能夠參照下圖,可能不太準確但仍是能夠幫助你們理解
執行環境的內容大概就是這些,明天更新做用域、做用域鏈相關內容