国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入執(zhí)行環(huán)境、作用域鏈和閉包

gyl_coder / 1769人閱讀

摘要:執(zhí)行環(huán)境對(duì)象和作用域鏈執(zhí)行環(huán)境,又稱執(zhí)行上下文,是指一個(gè)函數(shù)在執(zhí)行的時(shí)候所能直接引用的變量等的一個(gè)集合。為了解釋作用域鏈的機(jī)制,我們?cè)賮?lái)引入一個(gè)屬性的概念。而函數(shù)的執(zhí)行環(huán)境對(duì)象作用域鏈保存了函數(shù)在執(zhí)行時(shí)能解析到的變量。

執(zhí)行環(huán)境對(duì)象和作用域鏈

執(zhí)行環(huán)境,又稱執(zhí)行上下文,是指一個(gè)函數(shù)在執(zhí)行的時(shí)候所能直接引用的變量等的一個(gè)集合。

在JavaScript引擎中,執(zhí)行環(huán)境是由一類特殊的對(duì)象——執(zhí)行環(huán)境對(duì)象——來(lái)實(shí)現(xiàn)的。由于一個(gè)函數(shù)執(zhí)行的時(shí)候可能對(duì)應(yīng)不同的上下文,所以每次函數(shù)執(zhí)行的時(shí)候都會(huì)由引擎為該函數(shù)創(chuàng)建一個(gè)獨(dú)一無(wú)二的執(zhí)行環(huán)境對(duì)象。函數(shù)執(zhí)行完畢時(shí),由垃圾回收(GC)機(jī)制來(lái)決定是否將該執(zhí)行環(huán)境對(duì)象回收。

為了區(qū)別執(zhí)行環(huán)境和執(zhí)行上下文,我將下文中的執(zhí)行環(huán)境稱作“執(zhí)行上下文”。

注意:全局環(huán)境(全局作用域所在的環(huán)境)雖然不是一個(gè)函數(shù),但是其中的代碼執(zhí)行時(shí),也會(huì)有一個(gè)相應(yīng)的執(zhí)行環(huán)境對(duì)象與之對(duì)應(yīng)。

不同執(zhí)行環(huán)境中的變量是存在依賴關(guān)系的。
例如:一個(gè)全局執(zhí)行環(huán)境下創(chuàng)建的函數(shù)在執(zhí)行時(shí),其執(zhí)行環(huán)境需要知道全局執(zhí)行環(huán)境中的變量:window、document、以及其他聲明的全局變量(注意:未聲明的變量作為window對(duì)象的屬性,和聲明過(guò)的全局變量有略微的不同之處)。熟悉函數(shù)作用域概念的同學(xué),不難理解這種依賴關(guān)系。

這種依賴關(guān)系是通過(guò)執(zhí)行環(huán)境對(duì)象中的一個(gè)特殊的屬性,引用創(chuàng)建該函數(shù)時(shí)的所對(duì)應(yīng)的執(zhí)行環(huán)境對(duì)象來(lái)實(shí)現(xiàn)的。由于這種引用關(guān)系可以形成一條引用鏈,一個(gè)函數(shù)執(zhí)行時(shí),引擎對(duì)變量的解析就是通過(guò)對(duì)執(zhí)行環(huán)境對(duì)象引用鏈的遍歷來(lái)解析確定的。

這個(gè)引用鏈有個(gè)高大上的、經(jīng)常聽(tīng)到的名字——作用域鏈

為了解釋作用域鏈的機(jī)制,我們?cè)賮?lái)引入一個(gè)scope屬性的概念。

函數(shù)對(duì)象的scope屬性

我們知道,JavaScript的函數(shù)是Function構(gòu)造函數(shù)的實(shí)例,本質(zhì)是一類特殊的對(duì)象。某一個(gè)對(duì)象只可能在某一個(gè)獨(dú)一無(wú)二的執(zhí)行上下文中創(chuàng)建,但是函數(shù)對(duì)象會(huì)在不同的執(zhí)行上下文中執(zhí)行。

函數(shù)對(duì)象有很多屬性,其中一個(gè)就是只有在JavaScript引擎中可見(jiàn)的scope屬性。這個(gè)scope屬性指向創(chuàng)建該函數(shù)時(shí)對(duì)應(yīng)的執(zhí)行環(huán)境對(duì)象

該函數(shù)執(zhí)行的時(shí)候,使用函數(shù)內(nèi)的函數(shù)作用域變量創(chuàng)建一個(gè)新執(zhí)行環(huán)境對(duì)象,并且引用scope屬性指向的執(zhí)行環(huán)境對(duì)象。這個(gè)執(zhí)行環(huán)境對(duì)象和該函數(shù)的執(zhí)行上下文相對(duì)應(yīng)。

這三者對(duì)應(yīng)關(guān)系如下圖所示:

但是scope屬性依然引用創(chuàng)建這個(gè)函數(shù)的執(zhí)行環(huán)境對(duì)象,原因跟上面的解釋是一樣的:

一個(gè)函數(shù)只能在某個(gè)特定的執(zhí)行上下文中創(chuàng)建,但是會(huì)在不同的執(zhí)行上下文中執(zhí)行。

函數(shù)執(zhí)行時(shí)變量解析

從作用域鏈的角度解釋:首先從該函數(shù)所對(duì)應(yīng)的執(zhí)行環(huán)境對(duì)象中搜索該變量,如果沒(méi)有則沿著作用域鏈繼續(xù)搜索,直到找到為止。然后將數(shù)據(jù)取出或者存儲(chǔ)。

這里有一個(gè)優(yōu)化問(wèn)題:不要在代碼中過(guò)多的引用作用域鏈中離頭結(jié)點(diǎn)(即當(dāng)前執(zhí)行環(huán)境對(duì)象)較遠(yuǎn)的結(jié)點(diǎn)中的變量。解決辦法:將這個(gè)非頭結(jié)點(diǎn)中的變量賦值給函數(shù)局部變量變?yōu)轭^結(jié)點(diǎn)中的變量,這樣就不需要每次都去搜索作用域鏈了。

題外話:this

this可以認(rèn)為是一個(gè)特殊的變量,代表函數(shù)的調(diào)用者。每一個(gè)執(zhí)行環(huán)境對(duì)象中都有一個(gè)this,但是變量搜索時(shí),只需搜索當(dāng)前的執(zhí)行環(huán)境對(duì)象就可以找到這個(gè)變量。當(dāng)需要找到作用域鏈中非頭結(jié)點(diǎn)的this時(shí),需要將其保存為其他特定的能被引用到的局部變量來(lái)處理。

閉包

現(xiàn)在我們可以看看小宇宙中的黑魔法了。

函數(shù)B在函數(shù)A中被返回。那么創(chuàng)建函數(shù)B的執(zhí)行環(huán)境對(duì)象就是函數(shù)A對(duì)應(yīng)的執(zhí)行環(huán)境對(duì)象。那么函數(shù)B的scope對(duì)象會(huì)保存函數(shù)A的執(zhí)行環(huán)境對(duì)象。

而函數(shù)A的執(zhí)行環(huán)境對(duì)象作用域鏈保存了函數(shù)A在執(zhí)行時(shí)能解析到的變量。所以函數(shù)B中就能通過(guò)其scope屬性訪問(wèn)函數(shù)A的執(zhí)行環(huán)境中的變量。

假設(shè)函數(shù)B的調(diào)用者無(wú)法訪問(wèn)函數(shù)A中的變量,那么它只能通過(guò)函數(shù)B的行為來(lái)獲得函數(shù)A中的變量狀態(tài)。

此時(shí)函數(shù)B由于其scope屬性保存了函數(shù)A的執(zhí)行環(huán)境對(duì)象的作用域鏈,從而形成一個(gè)閉包

結(jié)束

一點(diǎn)微小的見(jiàn)解。

本文涉及JavaScript界的敏感話題,故而,如有紕漏,歡迎吐槽。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/90860.html

相關(guān)文章

  • 【進(jìn)階2-1期】深入淺出圖解作用鏈和閉包

    摘要:本期推薦文章從作用域鏈談閉包,由于微信不能訪問(wèn)外鏈,點(diǎn)擊閱讀原文就可以啦。推薦理由這是一篇譯文,深入淺出圖解作用域鏈,一步步深入介紹閉包。作用域鏈的頂端是全局對(duì)象,在全局環(huán)境中定義的變量就會(huì)綁定到全局對(duì)象中。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周開(kāi)始前端進(jìn)階的第二期,本周的主題是作用域閉包,今天是第6天。 本...

    levius 評(píng)論0 收藏0
  • javascript系列--javascript深入淺出圖解作用鏈和閉包

    摘要:變量對(duì)象也是有父作用域的。作用域鏈的頂端是全局對(duì)象。當(dāng)函數(shù)被調(diào)用的時(shí)候,作用域鏈就會(huì)包含多個(gè)作用域?qū)ο蟆.?dāng)函數(shù)要訪問(wèn)時(shí),沒(méi)有找到,于是沿著作用域鏈向上查找,在的作用域找到了對(duì)應(yīng)的標(biāo)示符,就會(huì)修改的值。 一、概要 對(duì)于閉包的定義(紅寶書(shū)P178):閉包就是指有權(quán)訪問(wèn)另外一個(gè)函數(shù)的作用域中的變量的函數(shù)。 關(guān)鍵點(diǎn): 1、閉包是一個(gè)函數(shù) 2、能夠訪問(wèn)另外一個(gè)函數(shù)作用域中的變量 二、閉包特性 對(duì)...

    Jensen 評(píng)論0 收藏0
  • 【進(jìn)階2-3期】JavaScript深入閉包面試題解

    摘要:閉包面試題解由于作用域鏈機(jī)制的影響,閉包只能取得內(nèi)部函數(shù)的最后一個(gè)值,這引起的一個(gè)副作用就是如果內(nèi)部函數(shù)在一個(gè)循環(huán)中,那么變量的值始終為最后一個(gè)值。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第二期,本周的主題是作用域閉包,今天是第8天。 本計(jì)劃一共28期,每期重點(diǎn)攻克一個(gè)面試重難點(diǎn),如果你還不了...

    alanoddsoff 評(píng)論0 收藏0
  • 【進(jìn)階2-2期】JavaScript深入之從作用域鏈理解閉包

    摘要:使用上一篇文章的例子來(lái)說(shuō)明下自由變量進(jìn)階期深入淺出圖解作用域鏈和閉包訪問(wèn)外部的今天是今天是其中既不是參數(shù),也不是局部變量,所以是自由變量。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第二期,本周的主題是作用域閉包,今天是第7天。 本計(jì)劃一共28期,每期重點(diǎn)攻克一個(gè)面試重難點(diǎn),如果你還不了解本進(jìn)階計(jì)...

    simpleapples 評(píng)論0 收藏0
  • JS基礎(chǔ)知識(shí):變量對(duì)象、作用鏈和閉包

    摘要:前言這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。而作用域鏈則是這套規(guī)則這套規(guī)則的具體運(yùn)行。是變量對(duì)象的縮寫(xiě)那這樣放有什么好處呢我們知道作用域鏈保證了當(dāng)前執(zhí)行環(huán)境對(duì)符合訪問(wèn)權(quán)限的變量和函數(shù)的有序訪問(wèn)。 前言:這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。之前看《JS高程》和一些技術(shù)博客,對(duì)于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術(shù)文章。這也給我的學(xué)習(xí)上造成了一些困惑,...

    Keven 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<