摘要:每個環境都可以向上搜索作用域鏈以查詢變量和函數名但任何環境都不能通過向下搜索作用域鏈而進入另一個執行環境。
執行環境(execution context,為簡單起見,有時也稱為“環境”)是 JavaScript 中最為重要的一個概念。執行環境定義了變量或函數有權訪問的其他數據,決定了它們各自的行為。每個執行環境都有一個與之關聯的變量對象(variable object),環境中定義的所有變量和函數都保存在這個對象中。雖然我們編寫的代碼無法訪問這個對象,但解析器在處理數據時會在后臺使用它。
全局執行環境是最外圍的一個執行環境。根據 ECMAScript 實現所在的宿主環境不同,表示執行環,因境的對象也不一樣。在 Web 瀏覽器中,全局執行環境被認為是 window 對象(第 7 章將詳細討論)
此所有全局變量和函數都是作為 window 對象的屬性和方法創建的。某個執行環境中的所有代碼執行完畢后,該環境被銷毀,保存在其中的所有變量和函數定義也隨之銷毀(全局執行環境直到應用程序退
出——例如關閉網頁或瀏覽器——時才會被銷毀)。
每個函數都有自己的執行環境。當執行流進入一個函數時,函數的環境就會被推入一個環境棧中。而在函數執行之后,棧將其環境彈出,把控制權返回給之前的執行環境。ECMAScript 程序中的執行流正是由這個方便的機制控制著。
當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。作用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象。如果這個環境是函數,則將其活動對象(activation object)作為變量對象。活動對象在最開始時只包含一個變量,即 arguments 對象(這個對象在全局環境中是不存在的)。作用域鏈中的下一個變量對象來自包含(外部)環境,而再下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境;全局執行環境的變量對象始終都是作用域鏈中的最后一個對象。
標識符解析是沿著作用域鏈一級一級地搜索標識符的過程。搜索過程始終從作用域鏈的前端開始,
然后逐級地向后回溯,直至找到標識符為止(如果找不到標識符,通常會導致錯誤發生)。
在局部作用域中定義的變量可以在局部環境中與全局變量互換使用,如下面這個例子所示:
var color = "blue"; function changeColor(){ var anotherColor = "red"; function swapColors(){ var tempColor = anotherColor; anotherColor = color; color = tempColor; // 這里可以訪問 color、anotherColor 和 tempColor } // 這里可以訪問 color 和 anotherColor,但不能訪問 tempColor swapColors(); } // 這里只能訪問 color changeColor();
以上代碼共涉及 3 個執行環境:全局環境、 changeColor() 的局部環境和 swapColors() 的局部
環境。全局環境中有一個變量 color 和一個函數 changeColor() 。 changeColor() 的局部環境中有一個名為 anotherColor 的變量和一個名為 swapColors() 的函數,但它也可以訪問全局環境中的變量 color 。 swapColors() 的局部環境中有一個變量 tempColor ,該變量只能在這個環境中訪問到。無論全局環境還是 changeColor() 的局部環境都無權訪問 tempColor 。然而,在 swapColors() 內部則可以訪問其他兩個環境中的所有變量,因為那兩個環境是它的父執行環境。圖 4-3 形象地展示了前面這個例子的作用域鏈。
圖中的矩形表示特定的執行環境。其中,內部環境可以通過作用域鏈訪問所有的外部環境,但
外部環境不能訪問內部環境中的任何變量和函數。這些環境之間的聯系是線性、有次序的。每個環境都
可以向上搜索作用域鏈,以查詢變量和函數名;但任何環境都不能通過向下搜索作用域鏈而進入另一個
執行環境。對于這個例子中的 swapColors() 而言,其作用域鏈中包含 3 個對象: swapColors() 的變量對象、 changeColor() 的變量對象和全局變量對象。 swapColors() 的局部環境開始時會先在自己的變量對象中搜索變量和函數名,如果搜索不到則再搜索上一級作用域鏈。 changeColor() 的作用域鏈中只包含兩個對象:它自己的變量對象和全局變量對象。這也就是說,它不能訪問swapColors() 的環境。
函數參數也被當作變量來對待,因此其訪問規則與執行環境中的其他變量相同。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85331.html
摘要:作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。這樣,一直延續到全局執行環境全局執行環境的變量對象始終都是作用域鏈中的最后一個對象。標識符解析是沿著作用域鏈一級一級地搜索標識符的過程。 執行環境(execution context,為簡單起見,有時也成為環境)是javascript中最為重要的一個概念。執行環境定義了變量或函數有權訪問的其他數據,決定了它們各自...
摘要:不是引用類型,無法輸出簡而言之,堆內存存放引用值,棧內存存放固定類型值。變量的查詢在變量的查詢中,訪問局部變量要比全局變量來得快,因此不需要向上搜索作用域鏈。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 基本類型值有:undefined,NUll,Boolean,Number和String,這些類型分別在內存中占有固定的大小空...
摘要:那其實閉包的原因就是外層函數的作用域對象無法釋放其實就是一個函數調用會生成的臨時作用域圖中可看出其實就是在中的匿名函數,所以他的就指向留下的作用域。 引言 網絡上關于作用域及閉包的文章很多,自己對于純理論知識并不能很快的理解,但自己對于圖畫有很強的記憶和理解能力,因此決定將此知識點以圖畫的知識表現出來,加深自身理解的同時如果能幫到正在學習的童鞋就再好不過了 下面我以函數的整個生命周期來...
摘要:作用域鏈保證對環境中定義的變量和函數的有序訪問。通俗來說,執行環境和作用域就是變量或函數有效執行所在的一個環境。總結要想搞清作用域,首先要搞清預解析,然后判斷作用域范圍,先判斷本層環境有無聲明及賦值,如果有聲明,則判斷調用前是否賦值。 這幾天看了一下JS高級程序設計里的介紹作用域的章節,也參考了網上的資料,現在結合著自己的理解,給大家分享一下我自己對JS作用域的理解。 作用域及執行環境...
摘要:作用域鏈所謂作用域鏈,是由當前環境與上層環境的一系列變量對象組成,它保證當前執行環境對符合訪問權限的變量和函數的有序訪問。當我們在執行函數的時候,需要的變量,在自己的作用域內找不到,便會順著作用域鏈往上找,直到找到全局作用域。 一 作用域相關? ? ? 作用域是一套規則,用來管理引擎如何查找變量。在es5之前,js只有全局作用域及函數作用域。es6引入了塊級作用域。但是這個塊級別作用域...
閱讀 2772·2021-11-02 14:42
閱讀 3163·2021-10-08 10:04
閱讀 1184·2019-08-30 15:55
閱讀 1025·2019-08-30 15:54
閱讀 2311·2019-08-30 15:43
閱讀 1680·2019-08-29 15:18
閱讀 863·2019-08-29 11:11
閱讀 2362·2019-08-26 13:52