摘要:作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。這樣,一直延續到全局執行環境全局執行環境的變量對象始終都是作用域鏈中的最后一個對象。標識符解析是沿著作用域鏈一級一級地搜索標識符的過程。
執行環境(execution context,為簡單起見,有時也成為“環境”)是javascript中最為重要的一個概念。執行環境定義了變量或函數有權訪問的其他數據,決定了它們各自的行為。每個執行環境都有一個與之關聯的變量對象(variable object),環境中定義的所有變量和函數都保存在這個對象中。雖然我們編寫的代碼無法訪問這個對象,但解析器在處理數據是會在后臺使用他。
這段話中著重介紹了執行環境的這個概念,這個執行環境的作用是定義了一種行為。這種行為定義了變量或者函數訪問其他數據的權限,這點和java中的設置private、protected、public等關鍵詞的作用類似。其實這也是函數或者變量作用域的體現。然后這個概念是抽象的,機器是無法表達出抽象概念的。為了表達出這個概念,通過引入了變量對象來實現,具體實現方式是,每個執行環境都有一個和他關聯的變量對象,環境中的變量和函數都存儲在這個變量對象中。變量對象在機器中是某種的數據結構。所以完美的實現了抽象概念到機器代碼的實現。最后本段結尾說:雖然我們編寫的帶代碼無法訪問這個對象,但在解析器(應該是js解析引擎)解析數據時,會在后臺會使用到。本人覺得有點不妥,像全局執行環境我們是可以反問這個對象的。為什么說不能訪問呢。這個地方值得商榷?
全局執行環境是最外圍的一個執行環境。根據ECMAScript實現所在的宿主環境不同,表示執行環境的對象也不一樣。在Web瀏覽器中,全局執行環境被認為是window對象,因此所有全局變量和函數都是作為window對象的屬性和方法創建的。某個執行環境中的所有代碼執行完畢后,該環境被銷毀,保存在其中的所有變量和函數定義也隨之銷毀(全局執行環境直到應用程序退出——例如關閉網頁或瀏覽器——時才會被銷毀)。
這段介紹了全局執行環境和其關聯的變量對象的實現。解析器通過Window對象來關聯這個全局執行環境。全局執行環境在用戶代理(一般指的是瀏覽器)被打開時創建,關閉時銷毀。當變量對象被銷毀時,存儲在其內的變量或者函數也會被銷毀。
每個函數在被調用時都會創建自己的執行環境。當執行流進入一個函數時,函數的環境就會被推入一個環境棧中。而在函數執行之后,棧將其環境彈出,把控制權返回給之前的執行環境。ECSMScript程序中的執行流正是由這個方便的機制控制著。
這段介紹了每個函數在被調用時都會創建一個和他對應的執行環境,和這個環境關聯的變量對象我們是訪問不了到,但是我們可以訪問其包含的一個屬性(或者是變量),即arguments對象。這也解釋了為什么每個函數內部,我們都可以通過arguments來訪問傳入的參數。最后介紹了js的執行流是通過環境棧的方式進行的。
當代碼在一個環境中執行時,會創建由變量對象構成的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。作用域鏈的前端,始終都是當前執行的代碼所在的的環境的變量對象。如果這個環境是函數,則將其活動對象(activation object)作為變量對象。活動對象在最開始時只包含一個變量,即arguments對象(這個對象在全局環境中是不存在的)。作用域中的下一個變量對象來自包含(外部)環境,而再下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境;全局執行環境的變量對象始終都是作用域鏈中的最后一個對象。
這段著重介紹了作用域鏈,其實可以看作是環境棧(環境棧中存儲的是相對應的變量對象)的另外一種表達方式。作用域鏈保證對執行環境有權訪問的所有變量和函數的有序訪問,這交代了環境棧的訪問方式是從上到下訪問。環境棧的頂部是當前執行的函數對應的活動對象,環境棧的底部是全局執行環境,即Window對象。
標識符解析是沿著作用域鏈一級一級地搜索標識符的過程。搜索過程始終從作用域鏈的前端開始,然后逐級地往后回溯,直至找到標識符為止(如果找不到標識符,通常會導致錯誤發生)。
作用域鏈的解析方式,結合環境棧的話,那么是從棧頂往下追溯,直到遇到全局執行對象。
PS:個人對執行環境的通俗理解,有錯誤,請包涵并指正出來。謝謝合作。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85291.html
摘要:所以的作用域是靜態作用域,也叫詞法作用域。總結是一門基于詞法作用域靜態作用域的語言,會沿著作用域鏈像氣泡一樣向外部尋找變量聲明。又是函數作用域的語言,在中,使用和關鍵字后,能讓變量處于塊作用域中,而且不存在聲明提升。 本文共 1700 字,讀完只需 7 分鐘 概述 變量,編程語言中我們用來模擬現實概念的工具,比方說,變量可以表示對象,數組,數字,字符。既然是工具,那么就用工具的適用范圍...
摘要:查詢是在作用域鏈中,一級級的往上查找該變量的引用。作用域和作用域鏈作用域的概念,應該兩張圖幾句話就能解釋吧。這個建筑代表程序中的嵌套作用域鏈。一層嵌一層的作用域形成了作用域鏈,變量在作用域鏈中的函數內得到了自己的定義。 javascript作用域和閉包之我見 看了《你不知道的JavaScript(上卷)》的第一部分——作用域和閉包,感受頗深,遂寫一篇讀書筆記加深印象。路過的大牛歡迎指點...
摘要:關于兩個專業術語的討論起自對你不知道的一書的閱讀學習。遇到,編譯器會詢問作用域是否已經有一個該名稱的變量存在于同一個作用域的集合中。摘錄來自你不知道的。 JS 編譯之 LHS RHS 一、前言 最近和朋友聊技術的時候,聊到 LHS RHS,我竟然沒聽說過 沒聽說過。。。 于是成功引起了我的好奇心。 關于兩個專業術語的討論起自對《你不知道的JavaScript》一書的閱讀學習。 二、編譯...
閱讀 3421·2021-10-20 13:49
閱讀 2793·2021-09-29 09:34
閱讀 3691·2021-09-01 11:29
閱讀 3081·2019-08-30 11:01
閱讀 838·2019-08-29 17:10
閱讀 867·2019-08-29 12:48
閱讀 2777·2019-08-29 12:40
閱讀 1348·2019-08-29 12:30