摘要:活動的執(zhí)行上下文組在邏輯上組成一個堆棧。堆棧底部永遠都是全局上下文,而頂部就是當前活動的執(zhí)行上下文。一個拋出的異常如果沒被截獲的話也有可能從一個或多個執(zhí)行上下文退出。相關(guān)代碼執(zhí)行完以后,只會包含全局上下文,一直到整個應(yīng)用程序結(jié)束。
1 定義
每次當控制器轉(zhuǎn)到ECMAScript可執(zhí)行代碼的時候,即會進入到一個執(zhí)行上下文。執(zhí)行上下文(簡稱-EC)是ECMA-262標準里的一個抽象概念,用于同可執(zhí)行代碼(executable code)概念進行區(qū)分。
標準規(guī)范沒有從技術(shù)實現(xiàn)的角度定義EC的準確類型和結(jié)構(gòu),這應(yīng)該是具體實現(xiàn)ECMAScript引擎時要考慮的問題。
活動的執(zhí)行上下文組在邏輯上組成一個堆棧。堆棧底部永遠都是全局上下文(global context),而頂部就是當前(活動的)執(zhí)行上下文。堆棧在EC類型進入和退出上下文的時候被修改(推入或彈出)。
2 全局代碼全局代碼不包括任何function體內(nèi)的代碼。
在初始化(程序啟動)階段,ECStack是這樣的:
ECStack = [ globalContext ];3 函數(shù)代碼
當進入funtion函數(shù)代碼(所有類型的funtions)的時候,ECStack被壓入新元素。需要注意的是,具體的函數(shù)代碼不包括內(nèi)部函數(shù)(inner functions)代碼。如下所示,我們使函數(shù)自己調(diào)自己的方式遞歸一次:
(function foo(bar) { if (bar) { return; } foo(true); })();
那么,ECStack以如下方式被改變:
// 第一次foo的激活調(diào)用
ECStack = [functionContext globalContext ];
// foo的遞歸激活調(diào)用
ECStack = [functionContext – recursively functionContext globalContext ];
每次return的時候,都會退出當前執(zhí)行上下文的,相應(yīng)地ECStack就會彈出,棧指針會自動移動位置,這是一個典型的堆棧實現(xiàn)方式。一個拋出的異常如果沒被截獲的話也有可能從一個或多個執(zhí)行上下文退出。相關(guān)代碼執(zhí)行完以后,ECStack只會包含全局上下文(global context),一直到整個應(yīng)用程序結(jié)束。
本文絕大多數(shù)內(nèi)容參考自: http://www.cnblogs.com/TomXu/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/86611.html
摘要:活動對象的變化與處理上下文的兩個階段密切相關(guān)。所有變量聲明由名稱和對應(yīng)值組成一個變量對象的屬性被創(chuàng)建如果變量名稱跟已經(jīng)聲明的形式參數(shù)或函數(shù)相同,則變量聲明不會干擾已經(jīng)存在的這類屬性。 1 定義 如果變量與執(zhí)行上下文相關(guān),那變量自己應(yīng)該知道它的數(shù)據(jù)存儲在哪里,并且知道如何訪問。這種機制稱為變量對象(variable object)。變量對象(縮寫為VO)是一個與執(zhí)行上下文相關(guān)的特殊對象,...
摘要:最后重點理解結(jié)論箭頭函數(shù)的,總是指向定義時所在的對象,而不是運行時所在的對象。輸出,箭頭函數(shù)不會綁定所以傳入指向無效。原因是,要徹底理解應(yīng)該是建立在已經(jīng)大致理解了中的執(zhí)行上下文,作用域作用域鏈,閉包,變量對象,函數(shù)執(zhí)行過程的基礎(chǔ)上。 本文共 2025 字,看完只需 8 分鐘 概述 前面的文章講解了 JavaScript 中的執(zhí)行上下文,作用域,變量對象,this 的相關(guān)原理,但是我...
摘要:全局和上下文中的作用域鏈這里不一定很有趣,但必須要提示一下。全局上下文的作用域鏈僅包含全局對象。代碼的上下文與當前的調(diào)用上下文擁有同樣的作用域鏈。代碼執(zhí)行時對作用域鏈的影響在中,在代碼執(zhí)行階段有兩個聲明能修改作用域鏈。 1 定義 我們已經(jīng)知道一個執(zhí)行上下文中的數(shù)據(jù)(參數(shù),變量,函數(shù))作為屬性存儲在變量對象中。 也知道變量對象是在每次進入上下文是創(chuàng)建并填入初始值,值的更新出現(xiàn)在代碼執(zhí)行階...
摘要:構(gòu)造函數(shù)中的當一個函數(shù)被作為一個構(gòu)造函數(shù)來使用使用關(guān)鍵字,它的與即將被創(chuàng)建的新對象綁定。因此,如果傳遞的值是一個原始值比如或,那么就會使用相關(guān)構(gòu)造函數(shù)將它轉(zhuǎn)換為對象,所以原始值通過被轉(zhuǎn)換為對象,而字符串使用轉(zhuǎn)化為對象,例如方法引入了。 1 全局上下文中的this 在瀏覽器引擎的全局運行上下文中(在任何函數(shù)體外部),this 指代全局對象,無論是否在嚴格模式下。 use str...
摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風格,導致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣鳌1疚膶⒒貧w面向?qū)ο蟊疽?,從對語言感悟的角度闡述為什...
閱讀 3582·2021-11-24 09:38
閱讀 3277·2021-11-22 09:34
閱讀 2172·2021-09-22 16:03
閱讀 2468·2019-08-29 18:37
閱讀 446·2019-08-29 16:15
閱讀 1834·2019-08-26 13:56
閱讀 932·2019-08-26 12:21
閱讀 2274·2019-08-26 12:15