成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

javascript中執(zhí)行環(huán)境及作用域的理解

BearyChat / 2665人閱讀

摘要:作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。這樣,一直延續(xù)到全局執(zhí)行環(huán)境全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象。標(biāo)識符解析是沿著作用域鏈一級一級地搜索標(biāo)識符的過程。

  

執(zhí)行環(huán)境(execution context,為簡單起見,有時也成為“環(huán)境”)是javascript中最為重要的一個概念。執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。每個執(zhí)行環(huán)境都有一個與之關(guān)聯(lián)的變量對象(variable object),環(huán)境中定義的所有變量和函數(shù)都保存在這個對象中。雖然我們編寫的代碼無法訪問這個對象,但解析器在處理數(shù)據(jù)是會在后臺使用他。

這段話中著重介紹了執(zhí)行環(huán)境的這個概念,這個執(zhí)行環(huán)境的作用是定義了一種行為。這種行為定義了變量或者函數(shù)訪問其他數(shù)據(jù)的權(quán)限,這點(diǎn)和java中的設(shè)置private、protected、public等關(guān)鍵詞的作用類似。其實這也是函數(shù)或者變量作用域的體現(xiàn)。然后這個概念是抽象的,機(jī)器是無法表達(dá)出抽象概念的。為了表達(dá)出這個概念,通過引入了變量對象來實現(xiàn),具體實現(xiàn)方式是,每個執(zhí)行環(huán)境都有一個和他關(guān)聯(lián)的變量對象,環(huán)境中的變量和函數(shù)都存儲在這個變量對象中。變量對象在機(jī)器中是某種的數(shù)據(jù)結(jié)構(gòu)。所以完美的實現(xiàn)了抽象概念到機(jī)器代碼的實現(xiàn)。最后本段結(jié)尾說:雖然我們編寫的帶代碼無法訪問這個對象,但在解析器(應(yīng)該是js解析引擎)解析數(shù)據(jù)時,會在后臺會使用到。本人覺得有點(diǎn)不妥,像全局執(zhí)行環(huán)境我們是可以反問這個對象的。為什么說不能訪問呢。這個地方值得商榷?

  

全局執(zhí)行環(huán)境是最外圍的一個執(zhí)行環(huán)境。根據(jù)ECMAScript實現(xiàn)所在的宿主環(huán)境不同,表示執(zhí)行環(huán)境的對象也不一樣。在Web瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是window對象,因此所有全局變量和函數(shù)都是作為window對象的屬性和方法創(chuàng)建的。某個執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢后,該環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀(全局執(zhí)行環(huán)境直到應(yīng)用程序退出——例如關(guān)閉網(wǎng)頁或瀏覽器——時才會被銷毀)。

這段介紹了全局執(zhí)行環(huán)境和其關(guān)聯(lián)的變量對象的實現(xiàn)。解析器通過Window對象來關(guān)聯(lián)這個全局執(zhí)行環(huán)境。全局執(zhí)行環(huán)境在用戶代理(一般指的是瀏覽器)被打開時創(chuàng)建,關(guān)閉時銷毀。當(dāng)變量對象被銷毀時,存儲在其內(nèi)的變量或者函數(shù)也會被銷毀。

  

每個函數(shù)在被調(diào)用時都會創(chuàng)建自己的執(zhí)行環(huán)境。當(dāng)執(zhí)行流進(jìn)入一個函數(shù)時,函數(shù)的環(huán)境就會被推入一個環(huán)境棧中。而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。ECSMScript程序中的執(zhí)行流正是由這個方便的機(jī)制控制著。

這段介紹了每個函數(shù)在被調(diào)用時都會創(chuàng)建一個和他對應(yīng)的執(zhí)行環(huán)境,和這個環(huán)境關(guān)聯(lián)的變量對象我們是訪問不了到,但是我們可以訪問其包含的一個屬性(或者是變量),即arguments對象。這也解釋了為什么每個函數(shù)內(nèi)部,我們都可以通過arguments來訪問傳入的參數(shù)。最后介紹了js的執(zhí)行流是通過環(huán)境棧的方式進(jìn)行的。

  

當(dāng)代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建由變量對象構(gòu)成的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的前端,始終都是當(dāng)前執(zhí)行的代碼所在的的環(huán)境的變量對象。如果這個環(huán)境是函數(shù),則將其活動對象(activation object)作為變量對象。活動對象在最開始時只包含一個變量,即arguments對象(這個對象在全局環(huán)境中是不存在的)。作用域中的下一個變量對象來自包含(外部)環(huán)境,而再下一個變量對象則來自下一個包含環(huán)境。這樣,一直延續(xù)到全局執(zhí)行環(huán)境;全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象。

這段著重介紹了作用域鏈,其實可以看作是環(huán)境棧(環(huán)境棧中存儲的是相對應(yīng)的變量對象)的另外一種表達(dá)方式。作用域鏈保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問,這交代了環(huán)境棧的訪問方式是從上到下訪問。環(huán)境棧的頂部是當(dāng)前執(zhí)行的函數(shù)對應(yīng)的活動對象,環(huán)境棧的底部是全局執(zhí)行環(huán)境,即Window對象。

  

標(biāo)識符解析是沿著作用域鏈一級一級地搜索標(biāo)識符的過程。搜索過程始終從作用域鏈的前端開始,然后逐級地往后回溯,直至找到標(biāo)識符為止(如果找不到標(biāo)識符,通常會導(dǎo)致錯誤發(fā)生)。

作用域鏈的解析方式,結(jié)合環(huán)境棧的話,那么是從棧頂往下追溯,直到遇到全局執(zhí)行對象。

PS:個人對執(zhí)行環(huán)境的通俗理解,有錯誤,請包涵并指正出來。謝謝合作。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/85291.html

相關(guān)文章

  • JavaScript之變量作用

    摘要:所以的作用域是靜態(tài)作用域,也叫詞法作用域??偨Y(jié)是一門基于詞法作用域靜態(tài)作用域的語言,會沿著作用域鏈像氣泡一樣向外部尋找變量聲明。又是函數(shù)作用域的語言,在中,使用和關(guān)鍵字后,能讓變量處于塊作用域中,而且不存在聲明提升。 本文共 1700 字,讀完只需 7 分鐘 概述 變量,編程語言中我們用來模擬現(xiàn)實概念的工具,比方說,變量可以表示對象,數(shù)組,數(shù)字,字符。既然是工具,那么就用工具的適用范圍...

    Faremax 評論0 收藏0
  • javascript作用域和閉包之我見

    摘要:查詢是在作用域鏈中,一級級的往上查找該變量的引用。作用域和作用域鏈作用域的概念,應(yīng)該兩張圖幾句話就能解釋吧。這個建筑代表程序中的嵌套作用域鏈。一層嵌一層的作用域形成了作用域鏈,變量在作用域鏈中的函數(shù)內(nèi)得到了自己的定義。 javascript作用域和閉包之我見 看了《你不知道的JavaScript(上卷)》的第一部分——作用域和閉包,感受頗深,遂寫一篇讀書筆記加深印象。路過的大牛歡迎指點(diǎn)...

    SoapEye 評論0 收藏0
  • JS編譯之 LHS RHS(你不知道的JavaScript 小記一)

    摘要:關(guān)于兩個專業(yè)術(shù)語的討論起自對你不知道的一書的閱讀學(xué)習(xí)。遇到,編譯器會詢問作用域是否已經(jīng)有一個該名稱的變量存在于同一個作用域的集合中。摘錄來自你不知道的。 JS 編譯之 LHS RHS 一、前言 最近和朋友聊技術(shù)的時候,聊到 LHS RHS,我竟然沒聽說過 沒聽說過。。。 于是成功引起了我的好奇心。 關(guān)于兩個專業(yè)術(shù)語的討論起自對《你不知道的JavaScript》一書的閱讀學(xué)習(xí)。 二、編譯...

    Cristic 評論0 收藏0
  • 深入理解閉包的概念

    摘要:離開閉包的泥淖,給這個例子一個較為合理的寫法總結(jié)理解閉包的概念是重要的,但我們不應(yīng)當(dāng)過多的使用閉包,它有優(yōu)點(diǎn),也優(yōu)缺點(diǎn),是一把雙刃劍。 閉包 關(guān)于閉包,目前有如下說法: 閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合(MDN) 函數(shù)對象可以通過作用域鏈相互關(guān)聯(lián)起來,函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi)。這種特性在計算機(jī)科學(xué)文獻(xiàn)中被稱為閉包(JavaScript權(quán)威指南) 閉包,指的是詞...

    anyway 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<