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