摘要:一執行上下文概念當函數執行時,會創建一個稱為執行上下文的內部對象可理解為作用域。一個執行上下文定義了一個函數執行時的環境。三變量對象概念變量對象是與執行上下文相關的數據作用域。閱讀更多參考文章了解的執行上下文論代碼執行上下文
一、執行上下文 1.1 概念
當函數執行時,會創建一個稱為執行上下文的內部對象(可理解為作用域)。一個執行上下文定義了一個函數執行時的環境。二、產生執行上下文的兩個階段
(1)在JavaScript解釋器內部,每次調用執行上下文,分為兩個階段,①創建階段 和 ②激活/代碼執行階段。
2.1 創建階段第一階段是創建階段,(當函數被調用,但未執行任何其內部代碼之前)。在創建階段主要做三件事:
(1)創建作用域鏈(Scope Chain)。
(2)創建變量對象(函數的形參、函數聲明、變量聲明)。
(3)求”this“的值。
當調用foo(22)時,創建狀態如下所示
2.2 激活/代碼執行階段(1)創建狀態負責處理定義屬性的名字,不為其指派具體的值,以及形參/實參的處理。
(2)一旦創建階段完成,執行流進入函數并且激活/代碼執行階段,Execution Context object就會更新。
2.3 三個屬性(1)對于每個執行上下文(Execution Context)都有三個重要的屬性,①變量對象(Variable object,VO),②作用域鏈(Scope chain)和 ③this。
三、變量對象(Variable Object) 3.1 概念(1)變量對象(variable object) 是與執行上下文相關的 數據作用域(scope of data) 。
(2)VO是與上下文關聯的特殊對象,用于存儲被定義在上下文中的 變量(variables) 和 函數聲明(function declarations) 。
(3)VO是一個抽象的概念,不同的上下文中,它表示使用不同的object。例如,在global全局上下文中,變量對象也是全局對象自身[global object]。(這就是我們可以通過全局對象的屬性來指向全局變量)。
3.2 初始化過程進入執行上下文時,VO的初始化過程具體如下:
(1)函數的形參(當進入函數執行上下文時) 變量對象的一個屬性,其屬性名就是形參的名字,其值就是實參的值;對于沒有傳遞的參數,其值為undefined。
(2)函數聲明(FunctionDeclaration, FD) 變量對象的一個屬性,其屬性名和值都是函數對象創建出來的;如果變量對象已經包含了相同名字的屬性,則替換它的值。
(3)變量聲明(var,VariableDeclaration) 變量對象的一個屬性,其屬性名即為變量名,其值為undefined;如果變量名和已經聲明的函數名或者函數的參數名相同,則不會影響已經存在的屬性。
四、活動對象(Activation object)(1)只有全局上下文的變量對象允許通過VO的屬性名稱間接訪問;
(2)在函數執行上下文中,VO是不能直接訪問的,此時由激活對象(Activation Object,縮寫為AO)扮演VO的角色。
(3)激活對象是在進入函數上下文時刻被創建的,它通過函數的arguments屬性初始化。
五、VO和AO的關系對于VO和AO的關系可以理解為,VO在不同的Execution Context中會有不同的表現:當在**Global Execution
Context中,可以直接使用VO;但是,在函數Execution Context中,AO**就會被創建。
閱讀更多
參考文章
了解JavaScript的執行上下文
JavaScript 論代碼執行上下文
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95039.html
摘要:什么是中的調用棧調用棧就像是程序當前執行的日志。當函數執行結束時,將從調用棧中出去。了解全局和局部執行上下文是掌握作用域和閉包的關鍵。總結引擎創建執行上下文,全局存儲器和調用棧。 原文作者:Valentino 原文鏈接:https://www.valentinog.com/blog/js-execution-context-call-stack 什么是Javascript中的執行上下文...
摘要:深入系列第七篇,結合之前所講的四篇文章,以權威指南的為例,具體講解當函數執行的時候,執行上下文棧變量對象作用域鏈是如何變化的。前言在深入之執行上下文棧中講到,當代碼執行一段可執行代碼時,會創建對應的執行上下文。 JavaScript深入系列第七篇,結合之前所講的四篇文章,以權威指南的demo為例,具體講解當函數執行的時候,執行上下文棧、變量對象、作用域鏈是如何變化的。 前言 在《Jav...
摘要:深入系列第三篇,講解執行上下文棧的是如何執行的,也回答了第二篇中的略難的思考題。 JavaScript深入系列第三篇,講解執行上下文棧的是如何執行的,也回答了第二篇中的略難的思考題。 順序執行? 如果要問到 JavaScript 代碼執行順序的話,想必寫過 JavaScript 的開發者都會有個直觀的印象,那就是順序執行,畢竟: var foo = function () { ...
摘要:執行上下文當代碼運行的時候,運行代碼的環境形成了執行上下文,執行上下文決定代碼可以訪問哪些變量函數對象等。我們將執行上下文簡單視為運行當前代碼的,我們知道作用域分為和。完成后,其執行堆棧將從堆棧中刪除,將控制權交給全局執行上下文。 我們通常將 JavaScript 歸類為動態或解釋執行語言,但實際上它也是一門編譯語言,它有自己的編譯器形式,運行在 JavaScript 引擎中。 每個 ...
摘要:深入系列第八篇,介紹理論上的閉包和實踐上的閉包,以及從作用域鏈的角度解析經典的閉包題。定義對閉包的定義為閉包是指那些能夠訪問自由變量的函數。 JavaScript深入系列第八篇,介紹理論上的閉包和實踐上的閉包,以及從作用域鏈的角度解析經典的閉包題。 定義 MDN 對閉包的定義為: 閉包是指那些能夠訪問自由變量的函數。 那什么是自由變量呢? 自由變量是指在函數中使用的,但既不是函數參數也...
摘要:執行上下文和執行棧是中關鍵概念之一,是難點之一。理解執行上下文和執行棧同樣有助于理解其他的概念如提升機制作用域和閉包等。函數執行完成,函數的執行上下文出棧,并且被銷毀。 前言 如果你是一名 JavaScript 開發者,或者想要成為一名 JavaScript 開發者,那么你必須知道 JavaScript 程序內部的執行機制。執行上下文和執行棧是JavaScript中關鍵概念之一,是Ja...
閱讀 729·2021-11-24 10:19
閱讀 1106·2021-09-13 10:23
閱讀 3428·2021-09-06 15:15
閱讀 1777·2019-08-30 14:09
閱讀 1684·2019-08-30 11:15
閱讀 1837·2019-08-29 18:44
閱讀 934·2019-08-29 16:34
閱讀 2457·2019-08-29 12:46