在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 執(zhí)行上下文(Execution Contexts)
代碼復(fù)用模式(避免篇)
S.O.L.I.D 五大原則之接口隔離原則 ISP
設(shè)計(jì)模式之狀態(tài)模式
JavaScript 核心(晉級(jí)高手必讀篇)
設(shè)計(jì)模式之建造者模式
JavaScript 與 DOM(上)——也適用于新手
設(shè)計(jì)模式之中介者模式
設(shè)計(jì)模式之裝飾者模式
設(shè)計(jì)模式之模板方法
設(shè)計(jì)模式之外觀模式
強(qiáng)大的原型和原型鏈
設(shè)計(jì)模式之構(gòu)造函數(shù)模式
揭秘命名函數(shù)表達(dá)式
深入理解J avaScript 系列(結(jié)局篇)
執(zhí)行上下文(Execution Contexts)
函數(shù)(Functions)
《你真懂 JavaScript 嗎?》答案詳解
設(shè)計(jì)模式之適配器模式
設(shè)計(jì)模式之組合模式
設(shè)計(jì)模式之命令模式
S.O.L.I.D 五大原則之單一職責(zé) SRP
編寫高質(zhì)量 JavaScript 代碼的基本要點(diǎn)
求值策略
閉包(Closures)
對(duì)象創(chuàng)建模式(上篇)
This? Yes,this!
設(shè)計(jì)模式之代理模式
變量對(duì)象(Variable Object)
S.O.L.I.D 五大原則之里氏替換原則 LSP
面向?qū)ο缶幊讨话憷碚?/span>
設(shè)計(jì)模式之單例模式
Function 模式(上篇)
S.O.L.I.D 五大原則之依賴倒置原則 DIP
設(shè)計(jì)模式之迭代器模式
立即調(diào)用的函數(shù)表達(dá)式
設(shè)計(jì)模式之享元模式
設(shè)計(jì)模式之原型模式
根本沒有“JSON 對(duì)象”這回事!
JavaScript 與 DOM(下)
面向?qū)ο缶幊讨?ECMAScript 實(shí)現(xiàn)
全面解析 Module 模式
對(duì)象創(chuàng)建模式(下篇)
設(shè)計(jì)模式之職責(zé)鏈模式
S.O.L.I.D 五大原則之開閉原則 OCP
設(shè)計(jì)模式之橋接模式
設(shè)計(jì)模式之策略模式
設(shè)計(jì)模式之觀察者模式
代碼復(fù)用模式(推薦篇)
作用域鏈(Scope Chain)
Function 模式(下篇)
設(shè)計(jì)模式之工廠模式

執(zhí)行上下文(Execution Contexts)

簡介

從本章開始,我將陸續(xù)(翻譯、轉(zhuǎn)載、整理)http://dmitrysoshnikov.com/網(wǎng)站關(guān)于 ECMAScript 標(biāo)標(biāo)準(zhǔn)理解的好文。

定義

每次當(dāng)控制器轉(zhuǎn)到 ECMAScript 可執(zhí)行代碼的時(shí)候,即會(huì)進(jìn)入到一個(gè)執(zhí)行上下文。執(zhí)行上下文(簡稱-EC)是 ECMA-262 標(biāo)準(zhǔn)里的一個(gè)抽象概念,用于同可執(zhí)行代碼(executable code)概念進(jìn)行區(qū)分。

標(biāo)準(zhǔn)規(guī)范沒有從技術(shù)實(shí)現(xiàn)的角度定義EC的準(zhǔn)確類型和結(jié)構(gòu),這應(yīng)該是具體實(shí)現(xiàn) ECMAScript 引擎時(shí)要考慮的問題。

活動(dòng)的執(zhí)行上下文組在邏輯上組成一個(gè)堆棧。堆棧底部永遠(yuǎn)都是全局上下文(global context),而頂部就是當(dāng)前(活動(dòng)的)執(zhí)行上下文。堆棧在EC類型進(jìn)入和退出上下文的時(shí)候被修改(推入或彈出)。

可執(zhí)行代碼類型

可執(zhí)行代碼的類型這個(gè)概念與執(zhí)行上下文的抽象概念是有關(guān)系的。在某些時(shí)刻,可執(zhí)行代碼與執(zhí)行上下文完全有可能是等價(jià)的。

例如,我們可以定義執(zhí)行上下文堆棧是一個(gè)數(shù)組:

ECStack = [];

每次進(jìn)入 function (即使 function 被遞歸調(diào)用或作為構(gòu)造函數(shù)) 的時(shí)候或者內(nèi)置的 eval 函數(shù)工作的時(shí)候,這個(gè)堆棧都會(huì)被壓入。

全局代碼

這種類型的代碼是在"程序"級(jí)處理的:例如加載外部的 js 文件或者本地標(biāo)簽內(nèi)的代碼。全局代碼不包括任何 function 體內(nèi)的代碼。

在初始化(程序啟動(dòng))階段,ECStack 是這樣的:

ECStack = [
  globalContext
];

函數(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 = [
  <foo> functionContext
  globalContext
];
// foo的遞歸激活調(diào)用
ECStack = [
  <foo> functionContext – recursively
  <foo> functionContext
  globalContext
];

每次 return 的時(shí)候,都會(huì)退出當(dāng)前執(zhí)行上下文的,相應(yīng)地 ECStack 就會(huì)彈出,棧指針會(huì)自動(dòng)移動(dòng)位置,這是一個(gè)典型的堆棧實(shí)現(xiàn)方式。一個(gè)拋出的異常如果沒被截獲的話也有可能從一個(gè)或多個(gè)執(zhí)行上下文退出。相關(guān)代碼執(zhí)行完以后,ECStac k只會(huì)包含全局上下文(global context),一直到整個(gè)應(yīng)用程序結(jié)束。

Eval 代碼

eval 代碼有點(diǎn)兒意思。它有一個(gè)概念: 調(diào)用上下文(calling context),例如,eval 函數(shù)調(diào)用的時(shí)候產(chǎn)生的上下文。eval(變量或函數(shù)聲明)活動(dòng)會(huì)影響調(diào)用上下文(calling context)。

eval('var x = 10');
(function foo() {
  eval('var y = 20');
})();
alert(x); // 10
alert(y); // "y" 提示沒有聲明

ECStac k的變化過程:

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

也就是一個(gè)非常普通的邏輯調(diào)用堆棧。

在版本號(hào) 1.7 以上的 SpiderMonkey(內(nèi)置于 Firefox,Thunderbird)的實(shí)現(xiàn)中,可以把調(diào)用上下文作為第二個(gè)參數(shù)傳遞給 eval。那么,如果這個(gè)上下文存在,就有可能影響“私有”(有人喜歡這樣叫它)變量。

function foo() {
  var x = 1;
  return function () { alert(x); };
};
var bar = foo();
bar(); // 1
eval('x = 2', bar); // 傳入上下文,影響了內(nèi)部的var x 變量
bar(); // 2

結(jié)論

這篇文章是后面分析其他跟執(zhí)行上下文相關(guān)的主題(例如變量對(duì)象,作用域鏈,等等)的最起碼的理論基礎(chǔ),這些主題將在后續(xù)章節(jié)中講到。

其他參考

這篇文章的內(nèi)容在 ECMA-262-3 標(biāo)準(zhǔn)規(guī)范中對(duì)應(yīng)的章節(jié)— 10. Execution Contexts