成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ECMA-262-3詳解(1)執(zhí)行上下文

tinyq / 1929人閱讀

摘要:邏輯上講,活躍的執(zhí)行上下文集合組成了一個(gè)棧。棧底是全局上下文,棧頂是當(dāng)前活躍執(zhí)行上下文。舉個(gè)例子,我們將執(zhí)行上下文定義成一個(gè)數(shù)組。一個(gè)拋出但是沒(méi)有捕獲的異??赡軐?dǎo)致退出一個(gè)或多個(gè)執(zhí)行上下文代碼代碼更加復(fù)雜。

原文地址

作者的話

有很多文章已經(jīng)對(duì)ECMAScript的核心概念做了詳盡解讀。本系列文章翻譯自Dmitry Soshnikov的個(gè)人網(wǎng)站,相信不少人已經(jīng)看過(guò)原文或者譯文。原文簡(jiǎn)潔易懂并且嚴(yán)謹(jǐn),條理清晰地闡明了所有JavaScript開(kāi)發(fā)者不得不深入理解的ECMAScript核心概念。重復(fù)翻譯的原因主要是為了個(gè)人收藏、整理之用。初次翻譯,技巧拙劣,如有不足,請(qǐng)不吝賜教。

正文

介紹

定義

可執(zhí)行代碼的類型

全局代碼

函數(shù)代碼

Eval代碼

結(jié)論

介紹

在這篇文章中我們將提到ECMAScript的執(zhí)行上下文和與之相關(guān)的可執(zhí)行代碼類型。

定義

每次當(dāng)控制轉(zhuǎn)移到ECMAScript可執(zhí)行的代碼,控制就進(jìn)入了一個(gè)執(zhí)行上下文。

執(zhí)行上下文(Execution context,縮寫:EC)是ECMA-262標(biāo)準(zhǔn)使用的抽象概念,用來(lái)分類和區(qū)別一段可執(zhí)行代碼

標(biāo)準(zhǔn)沒(méi)有從技術(shù)實(shí)現(xiàn)角度定義EC的準(zhǔn)確結(jié)構(gòu)和類型,這是ECMAScript引擎如何實(shí)現(xiàn)標(biāo)準(zhǔn)的問(wèn)題。
邏輯上講,活躍的執(zhí)行上下文集合組成了一個(gè)棧。棧底是全局上下文(global context),棧頂是當(dāng)前(活躍)執(zhí)行上下文。在進(jìn)入和退出不同的EC時(shí),棧被修改(pop/push)。

可執(zhí)行代碼的類型

可執(zhí)行代碼的類型的概念與執(zhí)行上下文的抽象概念相關(guān)。講到代碼類型,在特定時(shí)候,它可以指執(zhí)行上下文。

舉個(gè)例子,我們將執(zhí)行上下文定義成一個(gè)數(shù)組。

ECStack = [];

每次進(jìn)入一個(gè)函數(shù),棧會(huì)被壓入一個(gè)上下文(即使是函數(shù)被遞歸調(diào)用,或者作為構(gòu)造函數(shù)被調(diào)用),在eval函數(shù)中也是如此。

全局代碼

這個(gè)類型的代碼在程序Program)層面被處理:比如加載的外部js文件、內(nèi)聯(lián)代碼(在標(biāo)簽內(nèi))。全局代碼不包含任何函數(shù)體內(nèi)的代碼。

在初始化(程序開(kāi)始)時(shí),ECStack看起來(lái)像這樣:

ECStack = [
  globalContext
];
函數(shù)代碼

在進(jìn)入函數(shù)代碼(所有類型的函數(shù))時(shí),ECStack會(huì)被塞入新的元素。需要注意到:所說(shuō)的函數(shù)代碼不包含內(nèi)部函數(shù)的代碼。

舉個(gè)例子,我們看看這個(gè)遞歸調(diào)用自身一次的函數(shù):

(function foo(flag) {
  if (flag) {
    return;
  }
  foo(true);
})(false);

然后,ECStack被修改成下面這樣:

// first activation of foo
ECStack = [
   functionContext
  globalContext
];
  
// recursive activation of foo
ECStack = [
   functionContext – recursively 
   functionContext
  globalContext
];

每次函數(shù)返回會(huì)退出當(dāng)前執(zhí)行上下文,ECStack彈出一個(gè)元素。當(dāng)這段代碼的工作結(jié)束,ECStack再一次地僅包含globalContext-直到程序退出。

一個(gè)拋出但是沒(méi)有捕獲的異??赡軐?dǎo)致退出一個(gè)或多個(gè)執(zhí)行上下文:

(function foo() {
  (function bar() {
    throw "Exit from bar and foo contexts";
  })();
})();
Eval代碼

eval代碼更加復(fù)雜。在這種情況下,有一個(gè)概念叫調(diào)用上下文calling context),比如eval函數(shù)被調(diào)用的地方的上下文:

// influence global context
eval("var x = 10");
 
(function foo() {
  // and here, variable "y" is
  // created in the local context
  // of "foo" function
  eval("var y = 20");
})();
  
alert(x); // 10
alert(y); // "y" is not defined

注意,在ES5的嚴(yán)格模式中,eval已經(jīng)不會(huì)影響 調(diào)用上下文,而是在本地沙箱中運(yùn)行代碼。

對(duì)于上面的例子,我們有如下的ECStack修改:

ECStack = [
  globalContext
];
  
// eval("var x = 10");
ECStack.push({
  context: evalContext,
  callingContext: globalContext
});
 
// eval exited context
ECStack.pop();
 
// foo funciton call
ECStack.push( functionContext);
 
// eval("var y = 20");
ECStack.push({
  context: evalContext,
  callingContext:  functionContext
});
 
// return from eval 
ECStack.pop();
 
// return from foo
ECStack.pop();

非常隨意而正常的調(diào)用棧。
在老版的SpiderMonkey 實(shí)現(xiàn)(firefox)中,最多到1.7版本,可以將 調(diào)用上下文作為第二個(gè)參數(shù)傳給eval函數(shù)。因此,如果上下文任存在,會(huì)影響到私有變量:

function foo() {
  var x = 1;
  return function () { alert(x); };
};
 
var bar = foo();
 
bar(); // 1
 
eval("x = 2", bar); // pass context, influence internal var "x"
 
bar(); // 2

然而,由于現(xiàn)代引擎的安全問(wèn)題,它被修復(fù)而不在有意義。

ES2015+引入了一種新的代碼類型-模塊代碼

結(jié)論

這些基礎(chǔ)的理論需要被用來(lái)更深入地研究與執(zhí)行上下文相關(guān)的細(xì)節(jié),比如變量對(duì)象作用域鏈,這些描述可以在適當(dāng)?shù)恼鹿?jié)被找到。

原始作者:Dmitry Soshnikov
原始發(fā)布時(shí)間:2009-06-26

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96823.html

相關(guān)文章

  • ECMA-262-3詳解(2)變量對(duì)象

    摘要:不同執(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)看過(guò)原文或者譯文。原文簡(jiǎn)潔易懂...

    MAX_zuo 評(píng)論0 收藏0
  • 執(zhí)行下文執(zhí)行環(huán)境)-Chapter1

    摘要:堆棧結(jié)構(gòu)的底部是全局執(zhí)行上下文,頂部是當(dāng)前執(zhí)行上下文。不同的執(zhí)行上下文切換時(shí)堆棧會(huì)發(fā)生改變譯論及代碼類型時(shí),在某些時(shí)候可能也意味著執(zhí)行上下文。函數(shù)體中代碼執(zhí)行完后,只剩全局上下文直到程序結(jié)束譯代碼更有意思。 第一次翻譯,希望各位多多包涵,有錯(cuò)誤處還望指出,歡迎提出建議。 Chapter 1.Execution Contexts Introduction (介紹) Definitio...

    elisa.yang 評(píng)論0 收藏0
  • JavaScript中的執(zhí)行下文

    摘要:如果在全局代碼中調(diào)用函數(shù),程序的順序流進(jìn)入被調(diào)用的函數(shù),創(chuàng)建新的執(zhí)行上下文并將其推送到執(zhí)行堆棧的頂部。每次調(diào)用函數(shù)時(shí),都會(huì)創(chuàng)建一個(gè)新的執(zhí)行上下文。 翻譯:瘋狂的技術(shù)宅鏈接:http://davidshariff.com/blog/... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 在這篇文章中,我將深入探討JavaScript的最...

    cfanr 評(píng)論0 收藏0
  • 深入理解JavaScript系列4:立即調(diào)用的函數(shù)表達(dá)式

    摘要:前言大家學(xué)的時(shí)候,經(jīng)常遇到自執(zhí)行匿名函數(shù)的代碼,今天我們主要就來(lái)想想說(shuō)一下自執(zhí)行。其實(shí),前面兩個(gè)例子里的變量,也可以換成,因?yàn)楹屯饷娴牟辉谝粋€(gè)作用于,所以不會(huì)出現(xiàn)問(wèn)題,這也是匿名函數(shù)閉包的威力。 前言 大家學(xué)JavaScript的時(shí)候,經(jīng)常遇到自執(zhí)行匿名函數(shù)的代碼,今天我們主要就來(lái)想想說(shuō)一下自執(zhí)行。 在詳細(xì)了解這個(gè)之前,我們來(lái)談了解一下自執(zhí)行這個(gè)叫法,本文對(duì)這個(gè)功能的叫法也不一定完全對(duì)...

    roadtogeek 評(píng)論0 收藏0
  • JavaScript中的函數(shù)

    摘要:然后最后一步就是從父作用域鏈中將該特殊對(duì)象刪除,整個(gè)過(guò)程的偽代碼如下注意這里,該屬性不能刪除,只讀。 起因是我在逛sf的時(shí)候看到了一個(gè)人的提問(wèn): 為什么將函數(shù)c賦值給變量b,在函數(shù)體里面,給c賦值,為什么會(huì)失???也就是這代碼執(zhí)行時(shí)為什么c打印出來(lái)的不是3 var b = function c () { a=1, b=2, c=3; console.log(a); ...

    coolpail 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<