作用域鏈

作用域鏈(scope chain)

當(dāng)js碰到可執(zhí)行代碼時(shí)抬驴,首先必然會(huì)先創(chuàng)建執(zhí)行上下文翩概,其中包括了

定義

The scope chain property of each execution context is simply a collection of the current context's [VO] + all parent’s lexical [VO]s.
Scope = VO + All Parent VOs
Eg: scopeChain = [ [VO] + [VO1] + [VO2] + [VO n+1] ];
簡(jiǎn)而言之界拦, 作用域鏈?zhǔn)钱?dāng)前執(zhí)行上下文VO以及其父級(jí)詞法VO的集合。

函數(shù)的生命周期

創(chuàng)建階段

就是當(dāng)在預(yù)處理的時(shí)候碰到了一個(gè)函數(shù)扔字,當(dāng)前此函數(shù)并沒(méi)有被執(zhí)行旋奢,此時(shí)它的作用域已經(jīng)被確定了插勤。因?yàn)閖s使用的是詞法作用域沽瘦。

執(zhí)行階段

當(dāng)函數(shù)即將進(jìn)入執(zhí)行階段之前,它會(huì)先生成函數(shù)執(zhí)行上下文农尖,即上下文的創(chuàng)建階段析恋。上下文對(duì)象中的作用域鏈屬性也就在此刻被創(chuàng)建了。當(dāng)執(zhí)行上下文創(chuàng)建完畢盛卡,便進(jìn)入函數(shù)的執(zhí)行階段助隧。

內(nèi)容

作用域鏈既然是一個(gè)集合,它存儲(chǔ)在哪里滑沧?集合里面的內(nèi)容是如何被放進(jìn)去的呢并村?

存儲(chǔ)在哪里?

函數(shù)有一個(gè)內(nèi)部屬性叫做[[scope]滓技,當(dāng)在函數(shù)的創(chuàng)建階段時(shí)哩牍,就會(huì)保存所有父級(jí)的變量對(duì)象到[[scope]]中。它現(xiàn)在已經(jīng)有了除了自己本身執(zhí)行上下文中的VO以外的所有VO了令漂!

自己的VO

當(dāng)創(chuàng)建函數(shù)執(zhí)行上下文時(shí)膝昆,會(huì)先創(chuàng)建VO,然后將這個(gè)VO填充到作用域鏈的前端叠必。

舉個(gè)例子

var bar = 1
function foo() {
  var baz = 1
  console.log(baz)
}

foo()

詳細(xì)步驟如下:
1.js開(kāi)始執(zhí)行全局執(zhí)行上下文(globalContext)入棧
stack=[[globalContext]]

  1. foo函數(shù)被創(chuàng)建荚孵,確定作用域。保存作用域鏈到內(nèi)置屬性[[scope]]
    foo.[[scope]] = [globalContext.VO]

  2. foo函數(shù)將要被執(zhí)行纬朝,首先要生成foo函數(shù)的執(zhí)行上下文(fooContext)并將其壓入執(zhí)行棧
    stack=[[fooContext],[globalContext]]收叶,此時(shí)fooContext中屬性還沒(méi)有完成賦值。
    3.1 先復(fù)制foo.[[scope]]給fooContext
    此時(shí)fooContext = {scopeChain: [foo.[[scope]]]}
    3.2 確定VO
    此時(shí)

    fooContext = {
      VO: {
        arguments: {length: 0},
        baz: undefined
      },
      scopeChain: [foo.[[scope]]]
    }
    

    3.3 將VO對(duì)象放置于作用域鏈的前端
    此時(shí)

    fooContext = {
      VO: {
        arguments: {length: 0},
        baz: undefined
      },
      scopeChain: [VO, foo.[[scope]]]
    }
    
  3. 函數(shù)開(kāi)始執(zhí)行
    將VO依此賦值共苛,并執(zhí)行函數(shù)判没,foo執(zhí)行完畢蜓萄,fooContext從執(zhí)行棧中彈出
    此時(shí)stack=[globalContext]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哆致,隨后出現(xiàn)的幾起案子绕德,更是在濱河造成了極大的恐慌,老刑警劉巖摊阀,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異踪蹬,居然都是意外死亡胞此,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)跃捣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)漱牵,“玉大人,你說(shuō)我怎么就攤上這事疚漆『ㄕ停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵娶聘,是天一觀的道長(zhǎng)闻镶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)丸升,這世上最難降的妖魔是什么铆农? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮狡耻,結(jié)果婚禮上墩剖,老公的妹妹穿的比我還像新娘。我一直安慰自己夷狰,他們只是感情好岭皂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著沼头,像睡著了一般爷绘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘫证,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天揉阎,我揣著相機(jī)與錄音,去河邊找鬼背捌。 笑死毙籽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毡庆。 我是一名探鬼主播坑赡,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼烙如,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了毅否?” 一聲冷哼從身側(cè)響起亚铁,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎螟加,沒(méi)想到半個(gè)月后徘溢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捆探,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年然爆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黍图。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曾雕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出助被,到底是詐尸還是另有隱情剖张,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布揩环,位于F島的核電站搔弄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏检盼。R本人自食惡果不足惜肯污,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吨枉。 院中可真熱鬧蹦渣,春花似錦、人聲如沸貌亭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)圃庭。三九已至锄奢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剧腻,已是汗流浹背拘央。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留书在,地道東北人灰伟。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像儒旬,于是被迫代替她去往敵國(guó)和親栏账。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帖族,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 一、作用域Scope和上下文Context 在javascript中挡爵,作用域scope和上下文context是兩個(gè)...
    debugman007閱讀 765評(píng)論 0 1
  • 前言 本文翻譯自scope-chai 概要 通過(guò)第變量對(duì)象的學(xué)習(xí)我們知道竖般,執(zhí)行上下文的數(shù)據(jù)(變量、函數(shù)聲明茶鹃、函數(shù)形...
    snailTJ閱讀 308評(píng)論 0 0
  • 1.作用域鏈 1.1 作用域鏈?zhǔn)鞘裁矗?作用域鏈正是內(nèi)部上下文所有變量對(duì)象(包括父變量對(duì)象)的列表涣雕。首先,代碼在其...
    _賀瑞豐閱讀 310評(píng)論 0 1
  • 本文摘抄自?xún)暧鸬牟┛?JavaScript深入系列15篇正式完結(jié)](https://github.com/mqyq...
    bacbcc94613b閱讀 505評(píng)論 0 1
  • (注1:如果有問(wèn)題歡迎留言探討闭翩,一起學(xué)習(xí)胞谭!轉(zhuǎn)載請(qǐng)注明出處,喜歡可以點(diǎn)個(gè)贊哦D需尽)(注2:更多內(nèi)容請(qǐng)查看我的目錄。) ...
    love丁酥酥閱讀 816評(píng)論 3 2