成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

ninefive / 2593人閱讀

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

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

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

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

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


(出入棧操作)

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

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

作用域鏈

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

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

至此,我們來分析一下:小明殺豬妖就是調(diào)用某個函數(shù)解決實際需求,但是他需要某個獨一無二的寶刀(變量),在中國某縣并未找到(當前作用域中并沒有定義此變量),于是他不得已在地球范圍內(nèi)尋找(順著作用域鏈條在前一作用域中尋找),在地球中找到了!(前一作用域中找到了此變量),于是愉快的殺豬去了(找到了變量順利解決了實際需求)。

回顧一下:作用域鏈是由每個作用域鏈接成的呈鏈狀變量對象集合,當前作用域不存在的變量就會依次向前一作用域?qū)ふ?,直到在根作用域在尋找,并且只能按照一定的順序?qū)ふ?,不能夠逆著順序?qū)ふ摇?/p> 原型鏈

原型鏈就是一種對象和創(chuàng)建此對象的對象之間的呈鏈式的關系鏈條。

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

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

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

分析關系

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

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

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

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

感謝各位看官至此,希望批評指正。

參考資料:

JavaScript高級程序設計第3版

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102164.html

相關文章

  • 「譯文」JavaScript核心

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

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

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

    yunhao 評論0 收藏0
  • 高性能JavaScript閱讀簡記(一)

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

    sorra 評論0 收藏0
  • 高性能JavaScript閱讀簡記(一)

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

    zhangrxiang 評論0 收藏0
  • 前端優(yōu)化-Javascript篇(3.標識符查找優(yōu)化)

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

    KaltZK 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<