通過上篇,我們已經知道js引擎是什么,那么我們就再了解一點更有意思的東西吧,
一.什么是可執行代碼(Execution code)
1.定義(Definitions)
js中合法的代碼,可以被js解析器執行的代碼(非官方定義)
2.類型(Types of execution code)
在ECMASscript中的代碼有三種類型:global, function和eval。
2.1全局代碼(Global code)
這種類型的代碼是在"程序"級處理的:例如加載外部的js文件或者本地標簽內的代碼。全局代碼不包括任何function體內的代碼。
2.2函數代碼(Function code)
函數體中的代碼(包括自定義和內建的函數)
2.3Eval代碼(Eval? code)
使用eval函數執行的代碼
二.什么是可執行上下文(Execution Context)
1.定義(Definitions)
每次當控制器轉到ECMAScript可執行代碼的時候,即會進入到一個執行上下文。執行上下文(簡稱-EC)是ECMA-262標準里的一個抽象概念,用于同可執行代碼(executable code)概念進行區分。
2.類型(Types of execution code)--根據可執行代碼的類型,Weber也給執行上下文分類
2.1.Global Execution Context 全局執行上下文
代碼的默認運行環境,程序代碼一旦被載入,最先進入的執行環境.只有一個全局執行上下文.
2.2.Function Execution Context 函數執行上下文
每當調用一個函數,也就是執行函數體中的代碼會新建一個函數執行上下文環境.
2.3.Eval Execution Context Eval執行上下文
當使用eval函數執行代碼的時候,會新建一個eval執行上下文.
3.組成(compose)
一個執行的上下文可以抽象的理解為object。每一個執行的上下文都有一系列的屬性(我們稱為上下文狀態),他們用來追蹤關聯代碼的執行進度。這個圖示就是一個context的結構。
除了這3個所需要的屬性(變量對象(variable object),this指針(this value),作用域鏈(scope chain)),執行上下文根據具體實現還可以具有任意額外屬性。
三.什么是執行上下文棧(Execution Context Stack(ECS))
如下圖,所有的ECMAScript的程序執行都可以看做是一個執行上下文堆棧[execution context (EC) stack]。堆棧的頂部就是處于激活狀態的上下文。
當一段程序開始時,會先進入全局執行上下文環境[global execution context],
這個也是堆棧中最底部的元素。此全局程序會開始初始化,初始化生成必要的對象[objects]和函數[functions].
在此全局上下文執行的過程中,它可能會激活一些方法(當然是已經初始化過的),然后進入他們的上下文環境,然后將新的元素壓入堆棧。在這些初始化都結束之后,這個系統會等待一些事件(例如用戶的鼠標點擊等),會觸發一些方法,然后進入一個新的上下文環境。
見圖5,有一個函數上下文“EC1″和一個全局上下文“Global EC”,下圖展現了從“Global EC”進入和退出“EC1″時棧的變化:
ECMAScript運行時系統就是這樣管理代碼的執行。
我也是剛剛學習javascript這門語言,如果有什么理解錯誤的地方,歡迎指出。