在看Backbone源碼解析中看到“Events對象可以理解爲會被變成被調用的對象上下文”,由於對於js的對象上下文並不熟悉,便翻閱了多位前輩大神的博客,其中包括湯姆大叔的深入理解JavaScript系列(11):執行上下文(Execution Contexts)和360weboy 的深入理解Javascript之執行上下文(Execution Context);以下有大神們的理解解釋也有自己初步的理解,也當作是學習筆記進行記錄。
Javascript中代碼的運行環境分爲以下三種:
- 全局級別的代碼 - 這個是默認的代碼運行環境,一旦代碼被載入,引擎最先進入的就是這個環境。
- 函數級別的代碼 - 當執行一個函數時,運行函數體中的代碼。
- Eval的代碼 - 在Eval函數內運行的代碼。
上下文:是調用當前可執行代碼的對象的引用。
- 活動的執行上下文組在邏輯上組成一個堆棧。
- 堆棧底部永遠都是全局上下文,而頂部就是當前活動的執行上下文。
- 只存在一個全局的上下文,該上下文能被任何其他的上下文所訪問到。
- javascript的工作方式是單線程,只有唯一的一個事件在某一時刻被激活處理,其他的事件被放入隊列中,等待被處理。
- 函數的執行上下文的個數沒有限制。
- 每次某個函數被調用,就有個新的執行上下文被創建。
總體流程:
- 當js代碼文件被瀏覽器載入後,默認最先進入的是全局的執行上下文;
- 當在全部上下文中調用執行一個函數時,程序流就進入該被調用函數內,則該函數就創建了一個新的執行上下文,並且將其壓入到執行上下文堆棧的頂部
- 瀏覽器總是執行當前在堆棧頂部的上下文,一旦執行完畢,該上下文就會從堆棧頂部被彈出,然後進入它下一位的上下文執行代碼
- 這樣堆棧中的上下文就會被依次執行並且彈出堆棧,直到回到全局的上下文
執行上下文的建立過程:
- 建立階段(當調用一個函數的時候,在執行函數體內的具體代碼之前)
①建立arguments、參數、函數的聲明、變量的聲明(按照順序)
②建立作用域鏈
③確定this的值 - 代碼執行階段(變量賦值,函數引用,執行其他代碼)