標籤:
javascript上下文應該算是js這門語言基礎中的基礎,如果理解了它,就能比較清晰地理解js語句執行的流程,更好地分析代碼。
上下文分類:
1)全域層級的上下文 2)函數層級的上下文 3)eval函數內啟動並執行上下文
執行內容堆棧
在《javascript進階程式設計》中,上下文被稱為執行環境,其實表達的都是同一個東西。
在瀏覽器中,javascript引擎的工作方式是單線程的。也就是說,某一時刻只有唯一的一個事件是被啟用處理的,其它的事件被放入隊列中,等待被處理。
我們已經知道,當javascript代碼檔案被瀏覽器載入後,預設最先進入的是一個全域的執行內容。當在全域上下文中調用執行一個函數時,程式流就進入該被調用函數內,此時引擎就會為該函數建立一個新的執行內容,並且將其壓入到執行內容堆棧的頂部。瀏覽器總是執行當前在堆棧頂部的上下文,一旦執行完畢,該上下文就會從堆棧頂部被彈出,然後,進入其下的上下文執行代碼。這樣,堆棧中的上下文就會被依次執行並且彈出堆棧,直到回到全域的上下文。
執行內容建立過程
把執行內容看做一個對象,其下包含了以上3個屬性:
executionContextObj = { variableObject: { /* 函數中的arguments對象, 參數, 內部的變數以及函式宣告 */ }, scopeChain: { /* variableObject 以及所有父執行內容中的variableObject */ }, this: {} }
執行流程:
1找到當前上下文中的調用函數的代碼
2在執行被調用的函數體中的代碼以前,開始建立執行內容
3建立階段:
建立variableObject對象
1.建立arguments對象,檢查當前上下文中的參數,建立該對象下的屬性以及屬性值
2.檢查當前上下文中的函式宣告:
每找到一個函式宣告,就在variableObject下面用函數名建立一個屬性,屬性值就是指向該函數在記憶體中的地址的一個引用
如果上述函數名已經存在於variableObject下,那麼對應的屬性值會被新的引用所覆蓋。
3.檢查當前上下文中的變數聲明:
每找到一個變數的聲明,就在variableObject下,用變數名建立一個屬性,屬性值為undefined。
如果該變數名已經存在於variableObject屬性中,直接跳過(防止指向函數的屬性的值被變數屬性覆蓋為undefined),原屬性值不會被修改。
初始化範圍鏈
確定上下文中this的指向對象
4.代碼執行階段:
執行函數體中的代碼,一行一行地運行代碼,給variableObject中的變數屬性賦值。
理解了執行內容應該就對函式宣告的範圍提升和變數聲明提前有所理解了
javascript執行內容