Execution context stack(執(zhí)行上下文棧)

在ECMASscript中的代碼有三種類型:global, function和eval(eval是通過傳入字符串動態(tài)的插入代碼,后面的代碼并不知道eval中代碼是什么)危号。每一種類型都有它們自己的執(zhí)行上下文。只有一個全局執(zhí)行上下文干奢,可能有多個function和eval的執(zhí)行上下文另患。一個函數(shù)可以生成無數(shù)個執(zhí)行上下文,甚至遞歸芳绩。執(zhí)行上下文掀亥,或者全局上下文調(diào)起全局的一個函數(shù)上下文,這叫執(zhí)行上下文棧妥色。調(diào)起其他上下文的上下文被稱為caller搪花。被調(diào)起的上下文被成為callee。當一個caller激活一個callee的時候嘹害,一個執(zhí)行上下文就會被callee激活鳍侣。callee某些時候也會是調(diào)用其他callee的caller
。當caller調(diào)起callee吼拥,caller暫停執(zhí)行,將控制流傳遞給callee线衫。callee被放進 執(zhí)行上下文棧凿可。

執(zhí)行上下文棧

程序執(zhí)行最開始是在執(zhí)行上下文棧的最底部的全局執(zhí)行上下文。然后全局上下文提供了一些初始化,創(chuàng)造所需要的對象以及函數(shù)枯跑。全局上下文執(zhí)行期間惨驶,代碼會激活其他已經(jīng)創(chuàng)建的函數(shù),進入新的執(zhí)行上下文敛助,push新的元素到棧中粗卜。初始化執(zhí)行之后,運行系統(tǒng)會等待其他激活函數(shù)或者進入新的上下文的時間纳击。在下圖中续扔,有類似E1的執(zhí)行上下文和globalEC全局執(zhí)行上下文,通過globalEC改變進入或推出EC1.

執(zhí)行上下文棧進入退出

這就是ECMAscript的運行系統(tǒng)如何管理代碼的執(zhí)行。

每個執(zhí)行上下文可以呈現(xiàn)為一個對象焕数,我們來看一下他的結構和什么狀態(tài)下執(zhí)行上下文執(zhí)行他的代碼纱昧。

  • 執(zhí)行上下文

一個執(zhí)行上下文可以抽象的被表示成一個對象。每個執(zhí)行上下文設置的屬性(我們可以叫做執(zhí)行上下文的狀態(tài))堡赔,需要跟蹤執(zhí)行上下文進程的相關代碼识脆。下面的圖呈現(xiàn)的是執(zhí)行上下文的結構:

執(zhí)行上下文的結構

除了這三個需要的屬性(變量,this善已,作用域鏈)灼捂,一個執(zhí)行上下文的實現(xiàn)可能需要增加額外的狀態(tài)。

  • 變量對象

變量對象是存放這執(zhí)行上下文相關數(shù)據(jù)的容器换团,他是存儲定義在上下文中變量和函數(shù)聲明的對象悉稠。
注意:變量中不包含函數(shù)表達式(對比函數(shù)聲明)。
變量是抽象概念啥寇,在不同的上下文類型中偎球,運用不同的對象。比如:在全局執(zhí)行上下文中辑甜,變量對象是全局對象本身(這就是為什么我們能夠通過全局對象的屬性名引用全局對象)衰絮。

  • 激活對象
  • 作用域鏈
  • 閉包
  • this

JavaScript. The core.

不同execution context的變項不會互相影響─了解function背後運作的邏輯

閉包:使用靜態(tài)作用域是閉包的一個強制性要求。

// global "x"
var x = 10;

// global function
function foo() {
  console.log(x);
}

(function (funArg) {

  // local "x"
  var x = 20;

  // there is no ambiguity,
  // because we use global "x",
  // which was statically saved in
  // [[Scope]] of the "foo" function,
  // but not the "x" of the caller's scope,
  // which activates the "funArg"

  funArg(); // 10, but not 20

})(foo); // pass "down" foo as a "funarg"

還有一個很重要的點磷醋,幾個函數(shù)可能含有相同的父級作用域(這是一個很普遍的情況猫牡,例如有好幾個內(nèi)部或者全局的函數(shù))。在這種情況下邓线,在[[Scope]]中存在的變量是會共享的淌友。一個閉包中變量的變化,也會影響另一個閉包的骇陈。

function baz() {
  var x = 1;
  return {
    foo: function foo() { return ++x; },
    bar: function bar() { return --x; }
  };
}

var closures = baz();

console.log(
  closures.foo(), // 2
  closures.bar()  // 1
);

this:

this是和執(zhí)行的上下文環(huán)境息息相關的一個特殊對象震庭。因此,它也可以稱為上下文對象[context object]你雌。this是執(zhí)行上下文環(huán)境的一個屬性器联,而不是某個變量對象的屬性二汛。

在函數(shù)上下文[function context]中,this會可能會根據(jù)每次的函數(shù)調(diào)用而成為不同的值.this會由每一次caller提供,caller是通過調(diào)用表達式[call expression]產(chǎn)生的(也就是這個函數(shù)如何被激活調(diào)用的)拨拓。

談談javascript語法里一些難點問題

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肴颊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子渣磷,更是在濱河造成了極大的恐慌婿着,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醋界,死亡現(xiàn)場離奇詭異竟宋,居然都是意外死亡,警方通過查閱死者的電腦和手機物独,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門袜硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挡篓,你說我怎么就攤上這事婉陷。” “怎么了官研?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵秽澳,是天一觀的道長。 經(jīng)常有香客問我戏羽,道長担神,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任始花,我火速辦了婚禮妄讯,結果婚禮上,老公的妹妹穿的比我還像新娘酷宵。我一直安慰自己亥贸,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布浇垦。 她就那樣靜靜地躺著炕置,像睡著了一般。 火紅的嫁衣襯著肌膚如雪男韧。 梳的紋絲不亂的頭發(fā)上朴摊,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音此虑,去河邊找鬼甚纲。 笑死,一個胖子當著我的面吹牛朦前,可吹牛的內(nèi)容都是我干的贩疙。 我是一名探鬼主播讹弯,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼这溅!你這毒婦竟也來了?” 一聲冷哼從身側響起棒仍,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤悲靴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后莫其,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癞尚,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年乱陡,在試婚紗的時候發(fā)現(xiàn)自己被綠了浇揩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡憨颠,死狀恐怖胳徽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爽彤,我是刑警寧澤养盗,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站适篙,受9級特大地震影響往核,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嚷节,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一聂儒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硫痰,春花似錦衩婚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鳍悠,卻和暖如春税娜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藏研。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工敬矩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蠢挡。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓弧岳,卻偏偏與公主長得像凳忙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子禽炬,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容