摘要:執(zhí)行上下文的執(zhí)行階段,也有三個(gè)內(nèi)容變量賦值函數(shù)引用執(zhí)行其他代碼。的簡(jiǎn)寫(xiě),叫做活動(dòng)對(duì)象。先說(shuō)一下變量對(duì)象,它的結(jié)構(gòu)大致如此,在函數(shù)被調(diào)用的時(shí)候被創(chuàng)建變量對(duì)象包含函數(shù)的形參函數(shù)聲明變量聲明,三個(gè)內(nèi)容。
關(guān)于javascript中的變量對(duì)象和活動(dòng)對(duì)象
? ? ? ? 前面的文章說(shuō)到, 執(zhí)行上下文的創(chuàng)建階段,主要有三個(gè)內(nèi)容:
? ? ? ? 1、創(chuàng)建變量對(duì)象;2、初始化作用域鏈;3、確定this的指向。
? ? ? ? 執(zhí)行上下文的執(zhí)行階段,也有三個(gè)內(nèi)容:
? ? ? ? 1、變量賦值;2、函數(shù)引用;3、執(zhí)行其他代碼。
? ? ? ? 在這里先說(shuō)一個(gè)前提,我提到的函數(shù)調(diào)用,說(shuō)的是執(zhí)行上下文的第一階段,創(chuàng)建階段(還沒(méi)開(kāi)始執(zhí)行函數(shù)體相關(guān)的代碼),提到的函數(shù)執(zhí)行,說(shuō)的是執(zhí)行上下文的第二階段,執(zhí)行階段(開(kāi)始執(zhí)行函數(shù)體相關(guān)的代碼)。
? ? ? ? 其實(shí)在說(shuō)到執(zhí)行上下文中的的變量對(duì)象的時(shí)候,我印象中會(huì)冒出來(lái)兩個(gè)英文簡(jiǎn)寫(xiě):VO和AO。
? ? ? ? VO:Variable Object的簡(jiǎn)寫(xiě),就是變量對(duì)象。
? ? ? ? AO:Activation Object的簡(jiǎn)寫(xiě),叫做活動(dòng)對(duì)象。
? ? ? ? 這兩個(gè)東西有什么區(qū)別呢?
? ? ? ? 我的理解是,他們的區(qū)別就是在于執(zhí)行上下文的不同生命周期階段,變量對(duì)象VO在執(zhí)行上下文的創(chuàng)建階段,而活動(dòng)對(duì)象AO在執(zhí)行上下文的執(zhí)行階段。
? ? ? ? 先說(shuō)一下變量對(duì)象,它的結(jié)構(gòu)大致如此,在函數(shù)被調(diào)用的時(shí)候被創(chuàng)建:
VO:{ arguments:Arguments, FunctionName:reference to function FunctionName(){}, Variables:undefined }
? ? ? ? VO(變量對(duì)象)包含:函數(shù)的形參(arguments)、函數(shù)聲明(FunctionDeclaration, FD)、變量聲明(VariableDeclaration,var)三個(gè)內(nèi)容。
? ? ? ? 簡(jiǎn)單來(lái)說(shuō),舉個(gè)例子:
//聲明example函數(shù) function example(x){ var a = 10; function plus(){ return a + x; } return plus(); } //調(diào)用example函數(shù) example(5);
? ? ? ? 當(dāng)調(diào)用example函數(shù)的時(shí)候,進(jìn)入執(zhí)行上下文的創(chuàng)建階段,創(chuàng)建的變量對(duì)象為(自己看看什么是函數(shù)的形參、函數(shù)聲明和變量聲明):
VO:{ arguments:{x:undefined}, plus:reference to function plus(){}, a:undefined }
? ? ? ? 當(dāng)example函數(shù)開(kāi)始執(zhí)行的時(shí)候,進(jìn)入執(zhí)行上下文的執(zhí)行階段,變量對(duì)象就會(huì)被激活,首先通過(guò)arguments屬性初始化成為活動(dòng)對(duì)象AO:
AO:{ arguments:{callee:example,x:5,length:1}, plus:reference to function plus(){}, a:undefined }
? ? ? ? 當(dāng)然了,arguments屬性的值是Arguments對(duì)象,對(duì)于VO來(lái)說(shuō),由于創(chuàng)建階段只是形參,所以VO只有x一個(gè)undefined的值,而通過(guò)傳入確定的實(shí)參5初始化后,AO中的Arguments就多了指向自身函數(shù)callee和length兩個(gè)屬性了。
? ? ? ? 當(dāng)然,AO對(duì)象是隨著執(zhí)行代碼的執(zhí)行過(guò)程中而變化的,隨著代碼的執(zhí)行,變量開(kāi)始初始化,下一步AO就會(huì)變成:
AO:{ arguments:{callee:example,x:5,length:1}, plus:reference to function plus(){}, a:10 }
? ? ? ? 當(dāng)還有其他變量的時(shí)候,執(zhí)行過(guò)程自行理解一下就行了。
? ? ? ? 所以上下文的執(zhí)行階段:變量賦值、函數(shù)引用、執(zhí)行其他代碼。這個(gè)過(guò)程也可以輕易理解了。
? ? ? ? 最后,想說(shuō)一下全局上下文(或者叫做全局執(zhí)行上下文)的VO和AO,其實(shí)大家也可以知道,其實(shí)我們執(zhí)行所有的代碼,都是基于一個(gè)全局上下文上的,只要你不退出全局上下文(例如瀏覽器的話(huà)全局對(duì)象就是window,你不關(guān)閉窗口的話(huà),全局上下文就不會(huì)跳出執(zhí)行上下文棧),就一直都在全局執(zhí)行上下文的執(zhí)行階段了,所以執(zhí)行的階段就已經(jīng)是AO了。其次,本身沒(méi)有arguments屬性,這個(gè)也可以容易理解,全局對(duì)象它不是函數(shù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/84291.html
摘要:作用域的類(lèi)別可以影響到變量的取值,分為詞法作用域靜態(tài)作用域和動(dòng)態(tài)作用域。而,采用的就是詞法作用域,或者叫靜態(tài)作用域。 關(guān)于javascript中的作用域和作用域鏈 我GitHub上的菜鳥(niǎo)倉(cāng)庫(kù)地址: 點(diǎn)擊跳轉(zhuǎn)查看其他相關(guān)文章 文章在我的博客上的地址: 點(diǎn)擊跳轉(zhuǎn) ? ? ? ? 前面的文章說(shuō)到, 執(zhí)行上下文的創(chuàng)建階段,主要有三個(gè)內(nèi)容: ? ? ? ? 1、創(chuàng)建變量對(duì)象;2、初始化作用域...
摘要:閉包閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)當(dāng)某個(gè)函數(shù)被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境及相應(yīng)的作用域鏈。要注意通過(guò)第句聲明的這個(gè)方法屬于構(gòu)造函數(shù)生成的對(duì)象,而不屬于構(gòu)造函數(shù)的變量對(duì)象,也就是說(shuō),并不存在于作用域鏈中。 看到評(píng)論里有仁兄建議我試試箭頭函數(shù),真是受寵若驚,本來(lái)寫(xiě)這篇文章也只是想記錄寫(xiě)要點(diǎn)給自己日后看的。今天早上看到一篇總結(jié)javascript中this的文章JavaScr...
摘要:在此例中,在匿名函數(shù)被返回后,它的作用域鏈初始化為包含函數(shù)的活動(dòng)對(duì)象和全局變量對(duì)象。函數(shù)在執(zhí)行完畢后,其活動(dòng)對(duì)象也不會(huì)被銷(xiāo)毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象,結(jié)果就是只是的執(zhí)行環(huán)境的作用域鏈會(huì)被銷(xiāo)毀,其活動(dòng)對(duì)象會(huì)留在內(nèi)存中。 寫(xiě)在前面 注:這個(gè)系列是本人對(duì)js知識(shí)的一些梳理,其中不少內(nèi)容來(lái)自書(shū)籍:Javascript高級(jí)程序設(shè)計(jì)第三版和JavaScript權(quán)威指南第六版,...
摘要:為了防止之后自己又開(kāi)始模糊,所以自己來(lái)總結(jié)一下中關(guān)于作用域鏈和原型鏈的知識(shí),并將二者相比較看待進(jìn)一步加深理解。因此我們發(fā)現(xiàn)當(dāng)多個(gè)作用域相互嵌套的時(shí)候,就形成了作用域鏈。原型鏈原型說(shuō)完了作用域鏈,我們來(lái)講講原型鏈。 畢業(yè)也整整一年了,看著很多學(xué)弟都畢業(yè)了,忽然心中頗有感慨,時(shí)間一去不復(fù)還呀。記得從去年這個(gè)時(shí)候接觸到JavaScript,從一開(kāi)始就很喜歡這門(mén)語(yǔ)言,當(dāng)時(shí)迷迷糊糊看完了《J...
摘要:以上簡(jiǎn)單總結(jié)了下對(duì)執(zhí)行上下文和變量對(duì)象的理解,主要在于記錄總結(jié)一下學(xué)習(xí)成果,目前文章的水平實(shí)在不敢談分享。 執(zhí)行上下文(Execution Context) 文章同步到github javaScript中的執(zhí)行上下文和變量對(duì)象 JavaScript代碼執(zhí)行的過(guò)程,包括編譯和執(zhí)行兩個(gè)階段,編譯就是通過(guò)詞法分析,構(gòu)建抽象抽象語(yǔ)法樹(shù),并編譯成機(jī)器識(shí)別的指令,在JavaScript代碼編譯階段...
閱讀 1221·2021-09-03 10:44
閱讀 618·2019-08-30 13:13
閱讀 2810·2019-08-30 13:11
閱讀 1976·2019-08-30 12:59
閱讀 1044·2019-08-29 15:32
閱讀 1609·2019-08-29 15:25
閱讀 1003·2019-08-29 12:24
閱讀 1293·2019-08-27 10:58