摘要:不包括作為其嵌套函數(shù)的被解析的源代碼。作用域鏈當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。棧結(jié)構(gòu)最頂層的執(zhí)行環(huán)境稱為當(dāng)前運(yùn)行的執(zhí)行環(huán)境,最底層是全局執(zhí)行環(huán)境。無限制函數(shù)上下文?;蛘邟伋霎惓M顺鲆粋€(gè)執(zhí)行環(huán)境。
前言
其實(shí)規(guī)范這東西不是給人看的,它更多的是給語言實(shí)現(xiàn)者提供參考。但是當(dāng)碰到問題找不到答案時(shí),規(guī)范往往能提供想要的答案 。偶爾讀一下能夠帶來很大的啟發(fā)和思考,如果只讀一章 Javascript 規(guī)范,大神們覺得非第10章莫屬。
我們來試試看,這次選用的是 ECMA2.2的 5.1 版,整個(gè)規(guī)范才200頁, 而第10章共10頁,可以感受到 Javascript 的精簡,目前的版本加了太多 ES6 的東西,讓人望而生畏。
資料地址:http://www.ecma-international...
任務(wù)閱讀 ECMA262 5.1 第10章 Executable Code and Execution Contexts (可執(zhí)行代碼與執(zhí)行上下文)
你能針對(duì)這章內(nèi)容提出問題嗎? 即知道答案找出問題。
你能使用圖來更形象地表達(dá)文章內(nèi)容嗎?
原汁原味 ECMAScript 5.1 英文版
平易近人 ECMAScript 5.1 中文版
像 v8 等 JavaScript 引擎都是按照 ecma-262 的規(guī)范來實(shí)現(xiàn)的,JavaScript 引擎在解釋 JavaScript 代碼時(shí),將可執(zhí)行代碼分為了三種。分別是:
全局代碼
代碼加載時(shí)首先進(jìn)入的環(huán)境。 例如加載外部的 JavaScript 文件或者本地 標(biāo)簽內(nèi)的代碼。 但不包括任何 function 體內(nèi)的代碼。
函數(shù)代碼
是指作為 function 被解析的源代碼。 不包括作為其嵌套函數(shù)的 function 被解析的源代碼。 因?yàn)?JavaScript 函數(shù)中還可以嵌套函數(shù),因此這也是三種可執(zhí)行代碼中最復(fù)雜的一種。
eval代碼
指的是傳遞給 eval 內(nèi)置函數(shù)的代碼。
注:不了解 eval(string) 的小伙伴,請(qǐng)參考 eval() - JavaScript | MDN
詞法環(huán)境 (Lexical Environments)當(dāng) JavaScript 引擎開始執(zhí)行(進(jìn)入)一段可執(zhí)行代碼之后,會(huì)生成一個(gè)執(zhí)行環(huán)境(Execution Context),或執(zhí)行上下文。引擎用執(zhí)行環(huán)境來維護(hù)執(zhí)行當(dāng)前代碼所需要的變量聲明、this指向等。
詞法環(huán)境 是執(zhí)行環(huán)境的三個(gè)組成的狀態(tài)之一。
官方解釋:詞法環(huán)境是用來定義特定變量和函數(shù)標(biāo)識(shí)符的。一個(gè)詞法環(huán)境由一個(gè)環(huán)境記錄項(xiàng)和可能為空的外部詞法環(huán)境引用構(gòu)成。
通常詞法環(huán)境會(huì)與 ECMAScript 代碼諸如 函數(shù)聲明(FunctionDeclaration)、WithStatement 或者 TryStatement 的 Catch 塊這樣的特定句法結(jié)構(gòu)相聯(lián)系,且類似代碼每次執(zhí)行都會(huì)有一個(gè)新的詞法環(huán)境被創(chuàng)建出來。
外部詞法環(huán)境引用 用于表示詞法環(huán)境的邏輯嵌套關(guān)系模型。(內(nèi)部)詞法環(huán)境的外部引用是邏輯上包含內(nèi)部詞法環(huán)境的詞法環(huán)境。外部詞法環(huán)境自然也可能有多個(gè)內(nèi)部詞法環(huán)境。
例如,如果一個(gè) FunctionDeclaration 包含兩個(gè)嵌套的 FunctionDeclaration,那么每個(gè)內(nèi)嵌函數(shù)的詞法環(huán)境都是外部函數(shù)本次執(zhí)行所產(chǎn)生的詞法環(huán)境。
環(huán)境記錄項(xiàng) 又可以分為兩種聲明式環(huán)境記錄項(xiàng)和對(duì)象式環(huán)境記錄項(xiàng)。
聲明式環(huán)境記錄項(xiàng) 用于標(biāo)識(shí)標(biāo)識(shí)符和函數(shù)聲明、變量聲明、catch 語句等語法元素的綁定。對(duì)象式環(huán)境記錄項(xiàng) 主要用于定義那些將標(biāo)識(shí)符與具體對(duì)象的屬性綁定的語法元素。
咬文嚼字,不好理解?
通俗點(diǎn)講: 詞法環(huán)境就是 JavaScript 引擎在執(zhí)行代碼過程中用來標(biāo)識(shí)函數(shù)聲明、變量聲明這一類的。我們每次聲明一個(gè)函數(shù),或者使用 with 、catch語句的時(shí)候,就會(huì)有新的詞法環(huán)境被創(chuàng)建出來。全局詞法環(huán)境的外部詞法環(huán)境就是空的,因?yàn)樗呀?jīng)是最外層的詞法環(huán)境了。
我們用個(gè)例子來說明詞法環(huán)境:
var x = 10; function foo(y){ var z = 30; function bar(q){ return x+y+z+q; } return bar; } var bar = foo(20); bar(40);詞法環(huán)境的運(yùn)算
給出一個(gè)標(biāo)識(shí)符字符串,首先在當(dāng)前的詞法環(huán)境內(nèi)尋找,如果存在,返回引用的標(biāo)識(shí)符字符串,如果不存在,再在當(dāng)前詞法環(huán)境的外部詞法環(huán)境尋找。
咦,怎么感覺和作用域鏈的概念很相似?他們有什么關(guān)系嗎?
執(zhí)行環(huán)境 當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境會(huì)被推入一個(gè)環(huán)境棧中。當(dāng)函數(shù)執(zhí)行之后,環(huán)境棧將其彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。
作用域鏈 當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。其用途是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。一個(gè)包含環(huán)境的變量對(duì)象到另一個(gè)包含環(huán)境的變量對(duì)象,最后到全局執(zhí)行環(huán)境的變量對(duì)象。
函數(shù)只要被創(chuàng)建,就會(huì)有自己的“地盤”,有自己的作用域。但是只有函數(shù)被執(zhí)行的時(shí)候,才會(huì)有自己的執(zhí)行環(huán)境。函數(shù)執(zhí)行完畢的時(shí)候,執(zhí)行環(huán)境就會(huì)退出。而且一個(gè)作用域下可能存在多個(gè)執(zhí)行環(huán)境,比如閉包。
小總結(jié)1、詞法環(huán)境分為了兩部分:環(huán)境記錄項(xiàng)和外部詞法環(huán)境。
2、環(huán)境記錄項(xiàng)根據(jù)綁定的 ECMA 腳本元素的不同也分為了兩部分。
3、函數(shù)聲明或者使用 with 、catch語句時(shí),就會(huì)有新的詞法環(huán)境被創(chuàng)建出來。
如果我們的 JavaScript 程序有各種函數(shù),函數(shù)之間還有嵌套的情況,那 JavaScript 引擎怎么解釋各種聲明和執(zhí)行上下文哪?
當(dāng)控制器轉(zhuǎn)入 ECMA 腳本的可執(zhí)行代碼時(shí),上文已經(jīng)說了有三種可執(zhí)行代碼,不管進(jìn)入哪一種控制器都會(huì)進(jìn)入一個(gè)執(zhí)行環(huán)境。多個(gè)執(zhí)行環(huán)境在邏輯上形成一個(gè)棧結(jié)構(gòu)。棧結(jié)構(gòu)最頂層的執(zhí)行環(huán)境稱為當(dāng)前運(yùn)行的執(zhí)行環(huán)境,最底層是全局執(zhí)行環(huán)境。
用一張圖解釋
因?yàn)?JS 引擎被實(shí)現(xiàn)為單線程,也就是同一時(shí)間只能發(fā)生一件事情,其他的行為就會(huì)依次排隊(duì)。
你可以有任意多個(gè)函數(shù)執(zhí)行環(huán)境,每次調(diào)用函數(shù)創(chuàng)建一個(gè)新的執(zhí)行環(huán)境,會(huì)創(chuàng)建一個(gè)私有作用域,函數(shù)內(nèi)部聲明的任何變量都不能在當(dāng)前函數(shù)作用域外部直接訪問。函數(shù)能訪問當(dāng)前執(zhí)行環(huán)境外面的變量聲明,但在外部執(zhí)行環(huán)境不能訪問內(nèi)部的變量/函數(shù)聲明。
小總結(jié)關(guān)于執(zhí)行棧(調(diào)用棧)
單線程。 同步執(zhí)行。 一個(gè)全局上下文。 無限制函數(shù)上下文。 每次函數(shù)被調(diào)用創(chuàng)建新的執(zhí)行上下文,包括調(diào)用自己。 return 或者拋出異常退出一個(gè)執(zhí)行環(huán)境。
我們用一個(gè)具體的函數(shù)理解:
function foo(i) { if (i < 0) return; console.log("begin:" + i); foo(i - 1); console.log("end:" + i); } foo(2); // 輸出: // begin:2 // begin:1 // begin:0 // end:0 // end:1 // end:2
代碼的執(zhí)行流程進(jìn)入內(nèi)部函數(shù),創(chuàng)建一個(gè)新的執(zhí)行上下文并把它壓入執(zhí)行棧的頂部。瀏覽器總會(huì)執(zhí)行位于棧頂?shù)膱?zhí)行上下文,一旦當(dāng)前上下文函數(shù)執(zhí)行結(jié)束,它將被從棧頂彈出,并將上下文控制權(quán)交給當(dāng)前的棧。 這樣,堆棧中的上下文就會(huì)被依次執(zhí)行并且彈出堆棧,直到回到全局的上下文。
執(zhí)行環(huán)境包含所有用于追蹤與其相關(guān)的代碼的執(zhí)行進(jìn)度的狀態(tài)。精確地說,每個(gè)執(zhí)行環(huán)境包含如下表列出的組件。
執(zhí)行環(huán)境的三個(gè)狀態(tài)
組件 | 作用目的 |
---|---|
詞法環(huán)境 | 指定一個(gè)詞法環(huán)境對(duì)象,用于解析該執(zhí)行環(huán)境內(nèi)的代碼創(chuàng)建的標(biāo)識(shí)符引用。 |
變量環(huán)境 | 指定一個(gè)詞法環(huán)境對(duì)象,其環(huán)境數(shù)據(jù)用于保存由該執(zhí)行環(huán)境內(nèi)的代碼通過 變量表達(dá)式 和 函數(shù)表達(dá)式 創(chuàng)建的綁定。 |
this 綁定 | 指定該執(zhí)行環(huán)境內(nèi)的 ECMA 腳本代碼中 this 關(guān)鍵字所關(guān)聯(lián)的值。 |
當(dāng)創(chuàng)建一個(gè)執(zhí)行環(huán)境時(shí),其詞法環(huán)境組件和變量環(huán)境組件最初是同一個(gè)值。在該執(zhí)行環(huán)境相關(guān)聯(lián)的代碼的執(zhí)行過程中,變量環(huán)境組件永遠(yuǎn)不變,而詞法環(huán)境組件有可能改變。變量環(huán)境的不變和詞法環(huán)境的可能改變都是指引用的改變。
建立執(zhí)行環(huán)境進(jìn)入全局代碼解釋執(zhí)行全局代碼或使用 eval 函數(shù)輸入的代碼會(huì)創(chuàng)建并進(jìn)入一個(gè)新的執(zhí)行環(huán)境。每次調(diào)用 ECMA 腳本代碼定義的函數(shù)也會(huì)建立并進(jìn)入一個(gè)新的執(zhí)行環(huán)境,即便函數(shù)是自身遞歸調(diào)用的。
每一次 return 都會(huì)退出一個(gè)執(zhí)行環(huán)境。拋出異常也可退出一個(gè)或多個(gè)執(zhí)行環(huán)境。
當(dāng)控制流進(jìn)入一個(gè)執(zhí)行環(huán)境時(shí),會(huì)設(shè)置該執(zhí)行環(huán)境的 this 綁定組件,定義變量環(huán)境和初始詞法環(huán)境,并執(zhí)行聲明式綁定初始化過程。以上這些步驟的嚴(yán)格執(zhí)行方式由進(jìn)入的代碼的類型決定。
執(zhí)行以下步驟:
1、將變量環(huán)境設(shè)置為 全局環(huán)境 。 2、將詞法環(huán)境設(shè)置為 全局環(huán)境 。 3、將 this 綁定設(shè)置為 全局對(duì)象 。 4、使用全局代碼執(zhí)行聲明式綁定初始化化步驟。進(jìn)入函數(shù)代碼
當(dāng)控制流根據(jù)一個(gè)函數(shù)對(duì)象 F、調(diào)用者提供的 thisArg 以及調(diào)用者提供的 argumentList,進(jìn)入函數(shù)代碼的執(zhí)行環(huán)境時(shí),執(zhí)行以下步驟
如果函數(shù)代碼是嚴(yán)格模式下的代碼,設(shè) this 綁定 為 thisArg。 否則如果 thisArg 是 null 或 undefined,則設(shè) this 綁定 為全局對(duì)象。 否則如果 Type(thisArg) 的結(jié)果不為 Object,則設(shè) this 綁定 為 ToObject(thisArg)。 否則設(shè) this 綁定 為 thisArg。 以 F 的 [[Scope]] 內(nèi)部屬性為參數(shù)調(diào)用 NewDeclarativeEnvironment(新建聲明式詞法環(huán)境),并令 localEnv 為調(diào)用的結(jié)果。 設(shè) 詞法環(huán)境組件 為 localEnv。 設(shè) 變量環(huán)境組件 為 localEnv。 令 code 為 F 的 [[Code]] 內(nèi)部屬性的值。 使用函數(shù)代碼 code 和 argumentList 執(zhí)行聲明式綁定初始化化步驟。
我們用偽代碼表示一下:
if(是 嚴(yán)格模式) { this = thisArg } else if(thisArg === null || thisArg === undefined) { this = window } else if(typeof thisArg != "object") { this = Object(thisArg) } else { this = thisArg }
哎,這里的 thisArg 指的是什么?上文說了 thisArg 來自于函數(shù)的調(diào)用者。
這里代表函數(shù)的 apply,call,bind 等設(shè)置 this 綁定的參數(shù):
通過 call 或者 apply 調(diào)用函數(shù)時(shí),thisArg 的值比較明顯,為傳入的第一個(gè)參數(shù)。
Function.prototype.apply (thisArg, argArray) Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] )
當(dāng)然 thisArg 還有其他的可能,具體的可以參考這篇文章 Javascript this 解析
對(duì)上面的偽代碼做一下解釋:
嚴(yán)格模式: 也就是說,在嚴(yán)格模式下,this 只能為 thisArg,而當(dāng) thisArg 為 undefined 時(shí),this 就是 undefined ,而不是 window。
非嚴(yán)格模式: 如果 thisArg 是 null (如 fun.call(null)) 或 undefined (直接調(diào)用函數(shù)),則 this 為全局對(duì)象,瀏覽器里就是 window。
否則,如果 傳入了 thisArg, 但不是個(gè)對(duì)象,則把它轉(zhuǎn)為對(duì)象,并賦給 this,比如,當(dāng) fun.call("hhh") 時(shí),打印 fun 內(nèi)的 this 為
String {0: "h", 1: "h", 2: "h", length: 3, [[PrimitiveValue]]: "hhh"}
否則 ,也就是僅剩的一種情況,顯式的傳入了一個(gè)對(duì)象作為 thisArg 參數(shù)的情況下,設(shè) this 綁定為 thisArg。
聲明式綁定初始化每個(gè)執(zhí)行環(huán)境都有一個(gè)關(guān)聯(lián)的 變量環(huán)境。當(dāng)在一個(gè)執(zhí)行環(huán)境下評(píng)估一段 ECMA 腳本時(shí),變量和函數(shù)定義會(huì)以綁定的形式添加到這個(gè) 變量環(huán)境 的環(huán)境記錄中。對(duì)于函數(shù)代碼,參數(shù)也同樣會(huì)以綁定的形式添加到這個(gè) 變量環(huán)境 的環(huán)境記錄中。
總結(jié)ECMAScript 代碼的執(zhí)行由運(yùn)行環(huán)境來完成。不同的運(yùn)行環(huán)境可能采取不同的執(zhí)行方式,但基本的流程是相同的。如瀏覽器在解析 HTML 頁面中遇到 元素時(shí),會(huì)下載對(duì)應(yīng)的代碼來運(yùn)行,或直接執(zhí)行內(nèi)嵌的代碼。代碼的基本執(zhí)行方式是從上到下,順序執(zhí)行。在調(diào)用函數(shù)之后,代碼的執(zhí)行會(huì)進(jìn)入一個(gè)執(zhí)行上下文之中。由于在一個(gè)函數(shù)的執(zhí)行過程中會(huì)調(diào)用其他的函數(shù),執(zhí)行過程中的活動(dòng)執(zhí)行上下文會(huì)形成一個(gè)堆棧結(jié)構(gòu)。在棧頂?shù)氖钱?dāng)前正在執(zhí)行的代碼。當(dāng)函數(shù)返回時(shí),會(huì)退出當(dāng)前的執(zhí)行上下文,而回到之前的執(zhí)行上下文中。如果代碼執(zhí)行中出現(xiàn)異常,則可能從多個(gè)執(zhí)行上下文中退出。
在代碼執(zhí)行過程中很重要的一步是標(biāo)識(shí)符的解析。比如當(dāng)執(zhí)行過程中遇到語句 alert(val) 時(shí),首先要做的是解析標(biāo)識(shí)符 val 的值。ECMAScript 不同于 Java 和 C/C++ 等語言,在進(jìn)行標(biāo)識(shí)符解析時(shí)需要利用詞法環(huán)境并與函數(shù)調(diào)用方式相關(guān)。具體來說,標(biāo)識(shí)符解析由當(dāng)前代碼所對(duì)應(yīng)的執(zhí)行上下文來完成。為了描述標(biāo)識(shí)符的解析過程,ECMAScript 規(guī)范中使用了詞法環(huán)境的概念來進(jìn)行描述。一個(gè)詞法環(huán)境描述了標(biāo)識(shí)符與變量或函數(shù)之間的對(duì)應(yīng)關(guān)系。一個(gè)詞法環(huán)境由兩個(gè)部分組成:一部分是記錄標(biāo)識(shí)符與變量之間的綁定關(guān)系的環(huán)境記錄,另一部分是包圍當(dāng)前詞法環(huán)境的外部詞法環(huán)境。環(huán)境記錄可以看成是一個(gè)標(biāo)識(shí)符與變量或函數(shù)之間的映射表。不同詞法環(huán)境之間可以互相嵌套,而內(nèi)部詞法環(huán)境會(huì)持有一個(gè)包圍它的外部詞法環(huán)境的引用。在進(jìn)行標(biāo)識(shí)符解析時(shí),如果當(dāng)前詞法環(huán)境中找不到標(biāo)識(shí)符所對(duì)應(yīng)的變量或函數(shù),則使用外部詞法環(huán)境來嘗試解析。遞歸查找下去,直到解析成功或外部詞法環(huán)境為 null。
具體來說,根據(jù)標(biāo)識(shí)符關(guān)聯(lián)方式的不同,環(huán)境記錄可以進(jìn)一步分成兩類。兩種類型分別對(duì)應(yīng)不同的 ECMAScript 中不同的語法結(jié)構(gòu)。當(dāng)使用這些語法結(jié)構(gòu)時(shí),會(huì)對(duì)環(huán)境記錄中的內(nèi)容產(chǎn)生影響,進(jìn)而影響標(biāo)識(shí)符的解析過程。第一類環(huán)境記錄是聲明式環(huán)境記錄。顧名思義,聲明式環(huán)境記錄用來綁定 ECMAScript 代碼中的變量聲明。當(dāng)使用 var 聲明變量或使用類似 function func(){} 的形式聲明函數(shù)時(shí),對(duì)應(yīng)的變量或函數(shù)會(huì)被綁定到相應(yīng)的環(huán)境記錄中。另一類環(huán)境記錄是對(duì)象環(huán)境記錄。對(duì)象環(huán)境記錄并不綁定具體的變量或函數(shù),而是綁定另外一個(gè)對(duì)象中的屬性。對(duì)象環(huán)境變量主要用來描述 ECMAScript 中 with 操作符的行為。
每個(gè)執(zhí)行上下文會(huì)對(duì)應(yīng)兩個(gè)不同的詞法環(huán)境。一個(gè)是用來進(jìn)行標(biāo)識(shí)符解析的詞法環(huán)境,可能隨著代碼的執(zhí)行而發(fā)生變化;另外一個(gè)是包含執(zhí)行上下文對(duì)應(yīng)的作用域中的變量或函數(shù)聲明的詞法環(huán)境。
提問讀完這篇文章,問問自己,能夠回答下面的問題嗎?
1、ECMAScript 中可執(zhí)行代碼有幾種?
2、什么情況下會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境?
3、什么情況下會(huì)退出一個(gè)執(zhí)行環(huán)境?
4、作用域鏈和執(zhí)行環(huán)境的關(guān)系?
5、執(zhí)行環(huán)境的存在是為了解決什么?
6、詞法環(huán)境和變量環(huán)境的異同?
7、this 的綁定的幾種情況?
ES5/可執(zhí)行代碼與執(zhí)行環(huán)境
深入理解JavaScript系列(11):執(zhí)行上下文(Execution Contexts)
了解JavaScript的執(zhí)行上下文
深入理解JavaScript執(zhí)行上下文、函數(shù)堆棧、提升的概念
關(guān)于js作用域那些事
從 ECMAScript 規(guī)范來看 JS 的 this 綁定規(guī)則
深入探討 ECMAScript 規(guī)范
JavaScript欲速則不達(dá)—通過解析過程了解JavaScript
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/88516.html
摘要:標(biāo)準(zhǔn)對(duì)象,語義由本規(guī)范定義的對(duì)象。三個(gè)冒號(hào)作為分隔符分割數(shù)字字符串文法的產(chǎn)生式。所有因?yàn)閹淼膯栴},基本上是占著茅坑不拉屎的行為導(dǎo)致。以數(shù)組測試操作為例,標(biāo)準(zhǔn)中的描述如下相對(duì)于來說,規(guī)范中增加了對(duì)的處理。 前言 本文是對(duì)《ECMAScript 2018 Language Specification》的解讀。本文是對(duì)標(biāo)準(zhǔn)的概述性導(dǎo)讀,不是對(duì) ES2018特性的詳細(xì)描述,也不會(huì)針對(duì)某個(gè)技術(shù)...
摘要:不同執(zhí)行上下文中的變量對(duì)象對(duì)于所有的執(zhí)行上下文類型,變量對(duì)象的一些操作比如變量實(shí)例化和行為是共通的。從這點(diǎn)看,將變量對(duì)象看作是抽象的基礎(chǔ)的東西很便利。全局上下文的變量對(duì)象現(xiàn)在,應(yīng)該先給出全局對(duì)象的定義。 原文地址 作者的話 有很多文章已經(jīng)對(duì)ECMAScript的核心概念做了詳盡解讀。本系列文章翻譯自Dmitry Soshnikov的個(gè)人網(wǎng)站,相信不少人已經(jīng)看過原文或者譯文。原文簡潔易懂...
摘要:邏輯上講,活躍的執(zhí)行上下文集合組成了一個(gè)棧。棧底是全局上下文,棧頂是當(dāng)前活躍執(zhí)行上下文。舉個(gè)例子,我們將執(zhí)行上下文定義成一個(gè)數(shù)組。一個(gè)拋出但是沒有捕獲的異??赡軐?dǎo)致退出一個(gè)或多個(gè)執(zhí)行上下文代碼代碼更加復(fù)雜。 原文地址 作者的話 有很多文章已經(jīng)對(duì)ECMAScript的核心概念做了詳盡解讀。本系列文章翻譯自Dmitry Soshnikov的個(gè)人網(wǎng)站,相信不少人已經(jīng)看過原文或者譯文。原文簡潔...
摘要:本文總結(jié)了的各種情況,并從規(guī)范的角度探討了的具體實(shí)現(xiàn),希望對(duì)大家理解有所幫助。規(guī)范規(guī)范里面詳細(xì)介紹了的實(shí)現(xiàn)細(xì)節(jié),通過閱讀規(guī)范,我們可以更準(zhǔn)確的理解上述四種情況到底是怎么回事。由于本人能力有限,如有理解錯(cuò)誤的地方還望指出。 this是面向?qū)ο缶幊讨械囊粋€(gè)概念,它一般指向當(dāng)前方法調(diào)用所在的對(duì)象,這一點(diǎn)在java、c++這類比較嚴(yán)格的面向?qū)ο缶幊陶Z言里是非常明確的。但是在javascript...
摘要:另一方面,我不建議初次接觸的開發(fā)人員閱讀規(guī)范。在維護(hù)語言的最新規(guī)范。在這一點(diǎn)上,我想指出的是,絕對(duì)沒有人從上到下閱讀規(guī)范。拓展閱讀由于的定義,中的細(xì)節(jié)如冒泡錯(cuò)誤,直到塊在規(guī)范中不存在。換句話說,會(huì)轉(zhuǎn)發(fā)中拋出的錯(cuò)誤,并終止其余的步驟。 翻譯自:How to Read the ECMAScript Specification Ecmascript 語言規(guī)范 The ECMAScr...
閱讀 1740·2021-10-29 13:11
閱讀 966·2021-09-22 10:02
閱讀 1750·2021-08-20 09:35
閱讀 1625·2019-08-30 15:54
閱讀 2573·2019-08-30 15:44
閱讀 1452·2019-08-29 16:52
閱讀 1170·2019-08-23 12:56
閱讀 818·2019-08-22 15:16