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