javascript
javascript之执行上下文堆栈
執行上下文堆棧
有三種類型的ECMAScript代碼:全局代碼,函數代碼和eval代碼。代碼執行在它的執行上下文里。
有唯一的全局上下文,以及可能有多個函數和eval上下文。每一個函數調用,進入到函數的執行上
下文,執行函數的代碼。當調用到 eval 函數, 進入到 eval 執行上下文,執行它的代碼。
注意到,一個函數或許產生有限個上下文集合,因為每調用一個函數(甚至自身調用)產生一個
新的上下文,并伴隨著新的上下文狀態:
function foo( bar ){} //調用同一函數 //生成了三個不同的上下文,在每次調用時 //同時由不同的上下文狀態(bar的參數值不同) foo(10); foo(20); foo(30);一個上下文可以去激活另一個上下文稱為調用者。一個上下文正在激活稱為被調用者。被調
用者與此同時可能會成為別的被調用者的調用者(比如,一個函數被全局上下文調用,它又
調用了內部函數)。
?當一個調用者激活(調用)了被調用者,調用者就掛起了它的上下文,并且轉移了控制流程給被
調用者。被調用者就會推入棧,且成為正在執行的上下文。在被調用者結束之后,它就會移交控
制器給被調用者,再執行被調用者上下文過程(它可能激活別的上下文)直到它結束,依次類推。
被調用者可能簡單的返回或許異常退出。拋出異常而未捕獲可能退出(移除棧)一個或多個上下
文。
所有的ECMAScript程序運行時,執行堆棧如下圖,堆棧的最上面是當前的執行的上下文:
?
當程序開始執行時,它就會進入到全局執行上下文,它會在堆棧的最下面,也是堆棧的第一個元素。
此外,全局代碼會初始化,創建必要的對象和函數。在全局上下文執行時,它的代碼可能會激活別
的(已經創建)的函數,這個函數將會進入到他們的執行上下文,壓入新的元素到堆棧上,依次類
推。在這初始化執行完成之后,在運行的系統就會等著某些事件(比如,用戶的點擊)這樣會激活
函數,并進入到一個新的執行上下文。
?
在下面的圖里,有某個函數上下文叫EC1,以及全局上下文叫Global EC,我們有如下的流程堆棧修改
壓棧和出棧的EC1
?
這里明確的解釋了ECMAScript系統運行時,是如何管理執行的代碼。
關于執行上下文的更多信息在下一節里,執行上下文。
正如我們所說的,每個執行上下文在堆棧里可能是類似于對象。讓我們看看它的結構以及哪種狀態(哪
種屬性)一個上下文所需要的去執行它的代碼。
轉載于:https://www.cnblogs.com/branches/p/4883908.html
總結
以上是生活随笔為你收集整理的javascript之执行上下文堆栈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2015年阿里实习生面试Java研发工程
- 下一篇: Selenium测试专项三班隆重开班