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