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