亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

一起再看執(zhí)行上下文/作用域鏈/原型鏈

ninefive / 2642人閱讀

摘要:試想一下現(xiàn)在寫了一個(gè)函數(shù),并沒有調(diào)用這個(gè)函數(shù),那么現(xiàn)在有執(zhí)行上下文嗎現(xiàn)在有作用域嗎現(xiàn)在有作用域鏈嗎現(xiàn)在有原型鏈嗎執(zhí)行上下文沒有,執(zhí)行上下文是調(diào)用時(shí)產(chǎn)生的。

作為小白入坑的這段時(shí)間,這三個(gè)概念很早便深入我心,但是卻總感覺模模糊糊不知道該怎么講清楚其中的關(guān)系,甚至有時(shí)候還會(huì)混淆,正好今天拿出來復(fù)盤一下。

舉三個(gè)栗子 執(zhí)行上下文

簡(jiǎn)單直白的講執(zhí)行上下文就是一種環(huán)境。

類比一個(gè)賣豬肉的宇宙人小明,小明今天想要賣豬肉,那么首先宇宙是最根本的環(huán)境,在宇宙茫茫星海中他選擇了在地球上賣,所以他來到了地球,在地球這么多的地方選擇了中國(guó)某縣的豬肉鋪。至此他就開始賣豬肉了。你想想看,很大的空間里,小明先把宇宙壓入棧底,而后把存在與其中的地球又壓入棧內(nèi),然后又把地球中的中國(guó)某縣壓入棧內(nèi)部。是不是很像執(zhí)行環(huán)境的壓棧操作?當(dāng)他在某縣賺夠了碼農(nóng)的錢后被宇宙警察發(fā)現(xiàn)非法賣肉,便準(zhǔn)備溜了,先從某縣走出,然后逃離地球,最后跑出宇宙。


(出入棧操作)

在每個(gè)執(zhí)行上下文環(huán)境中都會(huì)提供一些變量。這是不是很像每個(gè)環(huán)境獨(dú)有的物質(zhì)基礎(chǔ)?比如在地球這個(gè)執(zhí)行上下文環(huán)境中還有其他一些地方可供選擇,在某縣賣肉的時(shí)候你需要的砍刀不就是這個(gè)環(huán)境提供給你的變量?

回顧一下:每個(gè)執(zhí)行上下文是一種環(huán)境,這種環(huán)境有大有?。ù笮≈傅氖莾?nèi)部包含的變量多少)在調(diào)用某個(gè)函數(shù)時(shí)就將這個(gè)函數(shù)的執(zhí)行上下文壓入棧中,同時(shí)執(zhí)行上下文中的變量對(duì)象被激活可用變?yōu)榛顒?dòng)變量。函數(shù)調(diào)用完畢就把此函數(shù)的執(zhí)行上下文出棧,當(dāng)然連同這個(gè)環(huán)境中的變量對(duì)象一起被踢出局,同時(shí)激活當(dāng)前棧頂?shù)膱?zhí)行上下文的變量對(duì)象。

作用域鏈

作用域鏈就是一種尋找變量的鏈條關(guān)系,每個(gè)執(zhí)行上下文中包含本環(huán)境中的變量對(duì)象并創(chuàng)建鏈條指向他的前一作用域。

接上個(gè)例子,小明在某縣豬肉鋪賣豬肉的時(shí)候,為了殺一頭豬妖,他必須找到一把鋒利的寶刀,但是尋遍了中國(guó)某縣也沒有適合的刀,于是他考慮是去日本打造一把軍刀還是在宇宙深處找一找有沒有適合的刀?猶豫不決,但是他畢竟是個(gè)商人,為了把刀出去大動(dòng)干戈還花錢,不如就地球內(nèi)隨便找把刀吧,但必須是他要的那個(gè)獨(dú)一無二的類型才能發(fā)揮他殺豬的最高境界!于是他在地球某處終于找到了那把絕世寶刀!順利殺妖抱得美人歸。

至此,我們來分析一下:小明殺豬妖就是調(diào)用某個(gè)函數(shù)解決實(shí)際需求,但是他需要某個(gè)獨(dú)一無二的寶刀(變量),在中國(guó)某縣并未找到(當(dāng)前作用域中并沒有定義此變量),于是他不得已在地球范圍內(nèi)尋找(順著作用域鏈條在前一作用域中尋找),在地球中找到了?。ㄇ耙蛔饔糜蛑姓业搅舜俗兞浚?,于是愉快的殺豬去了(找到了變量順利解決了實(shí)際需求)。

回顧一下:作用域鏈?zhǔn)怯擅總€(gè)作用域鏈接成的呈鏈狀變量對(duì)象集合,當(dāng)前作用域不存在的變量就會(huì)依次向前一作用域?qū)ふ?,直到在根作用域在尋找,并且只能按照一定的順序?qū)ふ遥荒軌蚰嬷樞驅(qū)ふ摇?/p> 原型鏈

原型鏈就是一種對(duì)象和創(chuàng)建此對(duì)象的對(duì)象之間的呈鏈?zhǔn)降年P(guān)系鏈條。

還是上個(gè)例子吧,小明覺得賣豬肉太不賺錢,于是搞起了養(yǎng)殖業(yè),他從某豬戶中購(gòu)得一懷了崽的豬,過了幾天便下崽了,于是就變成了豬生豬代代相傳。這個(gè)小明發(fā)現(xiàn)每一代豬都是倆并且這倆豬還只和他豬爸豬媽交流。

到這大家可以分析一下:這第一代懷了崽的豬就是null,后期由null產(chǎn)生了object與object.prototype這兩個(gè)對(duì)象,再由這兩個(gè)對(duì)象派生出了其他對(duì)象。或許一張圖你會(huì)看得更明白。

回顧一下:原型鏈其實(shí)就是對(duì)象和自己父母的關(guān)系,父母在和爺奶的關(guān)系。每代之間會(huì)有特點(diǎn)添加進(jìn)去,在你這里需要調(diào)用某個(gè)方法你卻沒有時(shí),可以向上一直找尋找到后調(diào)用。

分析關(guān)系

紅寶書中講:由多個(gè)執(zhí)行上下文的變量對(duì)象構(gòu)成的鏈表就叫做作用域鏈,所以作用域鏈表的產(chǎn)生是依附于執(zhí)行上下文的變量對(duì)象的,根據(jù)每個(gè)執(zhí)行上下文有自己的作用域,而后根據(jù)壓棧的關(guān)系組合成作用域鏈表。

原型鏈和他倆不摻合,原型鏈其實(shí)在構(gòu)造對(duì)象的過程中就已經(jīng)產(chǎn)生了,除非手動(dòng)的修改他的原型,這也是我們平時(shí)在調(diào)用一些自帶的API,并沒有寫具體實(shí)現(xiàn)卻能正常跑下來的原因。

試想一下:現(xiàn)在寫了一個(gè)函數(shù),并沒有調(diào)用這個(gè)函數(shù),那么現(xiàn)在有執(zhí)行上下文嗎?現(xiàn)在有作用域嗎?現(xiàn)在有作用域鏈嗎?現(xiàn)在有原型鏈嗎?

執(zhí)行上下文沒有,執(zhí)行上下文是調(diào)用時(shí)產(chǎn)生的。作用域已經(jīng)存在了,書寫完一個(gè)函數(shù)就確定了函數(shù)自己的作用域。那么作用域鏈呢?當(dāng)然是執(zhí)行上下文壓棧是才存在的。原型鏈也是函數(shù)寫完時(shí)他就已經(jīng)存在了,和是否調(diào)用該函數(shù)并無關(guān)系。

感謝各位看官至此,希望批評(píng)指正。

參考資料:

JavaScript高級(jí)程序設(shè)計(jì)第3版

深入理解javascript原型和閉包(完結(jié))

(圖片來源于網(wǎng)絡(luò))

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/102164.html

相關(guān)文章

  • 「譯文」JavaScript核心

    摘要:在這個(gè)情況下我們可能需要使用構(gòu)造函數(shù),其以指定的模式來創(chuàng)造對(duì)象。構(gòu)造函數(shù)也有自己的,值為,也通過其屬性關(guān)聯(lián)到。從邏輯上來說,這是以棧的形式實(shí)現(xiàn)的,它叫作執(zhí)行上下文棧。 原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 對(duì)象 原型鏈 構(gòu)造函數(shù) 執(zhí)行上下文棧 執(zhí)行上下文 變量對(duì)象 活動(dòng)對(duì)象 作用域鏈 閉包 Thi...

    高璐 評(píng)論0 收藏0
  • JS 執(zhí)行下文棧 / 作用

    摘要:每一個(gè)執(zhí)行上下文可以訪問的對(duì)象包括自身的作用域和父執(zhí)行上下文的作用域和父父執(zhí)行上下文作用域直到全局作用域,這就產(chǎn)生了作用域鏈。語(yǔ)句結(jié)束后,作用域鏈恢復(fù)正常。 0、自己理解 代碼執(zhí)行或函數(shù)調(diào)用生成執(zhí)行上下文(只有當(dāng)前執(zhí)行上下文有執(zhí)行權(quán)),該執(zhí)行上下文內(nèi)只能訪問當(dāng)前執(zhí)行上下文的變量、函數(shù)和上一級(jí)執(zhí)行上下文中的變量、函數(shù),激活下一個(gè)執(zhí)行上下文的時(shí)候執(zhí)行權(quán)轉(zhuǎn)移到新的執(zhí)行上下文,形成執(zhí)行上下文棧...

    yunhao 評(píng)論0 收藏0
  • 高性能JavaScript閱讀簡(jiǎn)記(一)

    摘要:對(duì)于直接量和局部變量的訪問性能差異微不足道,性能消耗代價(jià)高一些的是全局變量數(shù)組項(xiàng)對(duì)象成員。當(dāng)一個(gè)函數(shù)被創(chuàng)建后,作用域鏈中被放入可訪問的對(duì)象。同樣會(huì)改變作用域鏈,帶來性能問題。 早前閱讀高性能JavaScript一書所做筆記。 一、Loading and Execution 加載和運(yùn)行 從加載和運(yùn)行角度優(yōu)化,源于JavaScript運(yùn)行會(huì)阻塞UI更新,JavaScript腳本的下載、解析...

    sorra 評(píng)論0 收藏0
  • 高性能JavaScript閱讀簡(jiǎn)記(一)

    摘要:對(duì)于直接量和局部變量的訪問性能差異微不足道,性能消耗代價(jià)高一些的是全局變量數(shù)組項(xiàng)對(duì)象成員。當(dāng)一個(gè)函數(shù)被創(chuàng)建后,作用域鏈中被放入可訪問的對(duì)象。同樣會(huì)改變作用域鏈,帶來性能問題。 早前閱讀高性能JavaScript一書所做筆記。 一、Loading and Execution 加載和運(yùn)行 從加載和運(yùn)行角度優(yōu)化,源于JavaScript運(yùn)行會(huì)阻塞UI更新,JavaScript腳本的下載、解析...

    zhangrxiang 評(píng)論0 收藏0
  • 前端優(yōu)化-Javascript篇(3.標(biāo)識(shí)符查找優(yōu)化)

    摘要:下面我跟大家分享關(guān)于標(biāo)識(shí)符查找方面的優(yōu)化問題。這個(gè)變量對(duì)象會(huì)首先被放入作用域鏈中。執(zhí)行上下文也有一個(gè)作用域鏈,這個(gè)作用域鏈就是用來進(jìn)行變量查找的。當(dāng)執(zhí)行上下文創(chuàng)建時(shí),它的作用域鏈會(huì)用函數(shù)的屬性來初始化。   前面兩篇文章介紹了Javascript文件在頁(yè)面中位置以及異步加載問題對(duì)前端性能的影響。不過受限于單線程的原因,不管采用哪種方法,只要Javascript進(jìn)行了耗時(shí)的工作,就都會(huì)引...

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

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

0條評(píng)論

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