摘要:試想一下現(xiàn)在寫(xiě)了一個(gè)函數(shù),并沒(méi)有調(diào)用這個(gè)函數(shù),那么現(xiàn)在有執(zhí)行上下文嗎現(xiàn)在有作用域嗎現(xiàn)在有作用域鏈嗎現(xiàn)在有原型鏈嗎執(zhí)行上下文沒(méi)有,執(zhí)行上下文是調(diào)用時(shí)產(chǎn)生的。
作為小白入坑的這段時(shí)間,這三個(gè)概念很早便深入我心,但是卻總感覺(jué)模模糊糊不知道該怎么講清楚其中的關(guān)系,甚至有時(shí)候還會(huì)混淆,正好今天拿出來(lái)復(fù)盤(pán)一下。
舉三個(gè)栗子 執(zhí)行上下文簡(jiǎn)單直白的講執(zhí)行上下文就是一種環(huán)境。
類(lèi)比一個(gè)賣(mài)豬肉的宇宙人小明,小明今天想要賣(mài)豬肉,那么首先宇宙是最根本的環(huán)境,在宇宙茫茫星海中他選擇了在地球上賣(mài),所以他來(lái)到了地球,在地球這么多的地方選擇了中國(guó)某縣的豬肉鋪。至此他就開(kāi)始賣(mài)豬肉了。你想想看,很大的空間里,小明先把宇宙壓入棧底,而后把存在與其中的地球又壓入棧內(nèi),然后又把地球中的中國(guó)某縣壓入棧內(nèi)部。是不是很像執(zhí)行環(huán)境的壓棧操作?當(dāng)他在某縣賺夠了碼農(nóng)的錢(qián)后被宇宙警察發(fā)現(xiàn)非法賣(mài)肉,便準(zhǔn)備溜了,先從某縣走出,然后逃離地球,最后跑出宇宙。
(出入棧操作)
在每個(gè)執(zhí)行上下文環(huán)境中都會(huì)提供一些變量。這是不是很像每個(gè)環(huán)境獨(dú)有的物質(zhì)基礎(chǔ)?比如在地球這個(gè)執(zhí)行上下文環(huán)境中還有其他一些地方可供選擇,在某縣賣(mài)肉的時(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è)例子,小明在某縣豬肉鋪賣(mài)豬肉的時(shí)候,為了殺一頭豬妖,他必須找到一把鋒利的寶刀,但是尋遍了中國(guó)某縣也沒(méi)有適合的刀,于是他考慮是去日本打造一把軍刀還是在宇宙深處找一找有沒(méi)有適合的刀?猶豫不決,但是他畢竟是個(gè)商人,為了把刀出去大動(dòng)干戈還花錢(qián),不如就地球內(nèi)隨便找把刀吧,但必須是他要的那個(gè)獨(dú)一無(wú)二的類(lèi)型才能發(fā)揮他殺豬的最高境界!于是他在地球某處終于找到了那把絕世寶刀!順利殺妖抱得美人歸。
至此,我們來(lái)分析一下:小明殺豬妖就是調(diào)用某個(gè)函數(shù)解決實(shí)際需求,但是他需要某個(gè)獨(dú)一無(wú)二的寶刀(變量),在中國(guó)某縣并未找到(當(dāng)前作用域中并沒(méi)有定義此變量),于是他不得已在地球范圍內(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è)例子吧,小明覺(jué)得賣(mài)豬肉太不賺錢(qián),于是搞起了養(yǎng)殖業(yè),他從某豬戶(hù)中購(gòu)得一懷了崽的豬,過(guò)了幾天便下崽了,于是就變成了豬生豬代代相傳。這個(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è)方法你卻沒(méi)有時(shí),可以向上一直找尋找到后調(diào)用。
分析關(guān)系紅寶書(shū)中講:由多個(gè)執(zhí)行上下文的變量對(duì)象構(gòu)成的鏈表就叫做作用域鏈,所以作用域鏈表的產(chǎn)生是依附于執(zhí)行上下文的變量對(duì)象的,根據(jù)每個(gè)執(zhí)行上下文有自己的作用域,而后根據(jù)壓棧的關(guān)系組合成作用域鏈表。
原型鏈和他倆不摻合,原型鏈其實(shí)在構(gòu)造對(duì)象的過(guò)程中就已經(jīng)產(chǎn)生了,除非手動(dòng)的修改他的原型,這也是我們平時(shí)在調(diào)用一些自帶的API,并沒(méi)有寫(xiě)具體實(shí)現(xiàn)卻能正常跑下來(lái)的原因。
試想一下:現(xiàn)在寫(xiě)了一個(gè)函數(shù),并沒(méi)有調(diào)用這個(gè)函數(shù),那么現(xiàn)在有執(zhí)行上下文嗎?現(xiàn)在有作用域嗎?現(xiàn)在有作用域鏈嗎?現(xiàn)在有原型鏈嗎?
執(zhí)行上下文沒(méi)有,執(zhí)行上下文是調(diào)用時(shí)產(chǎn)生的。作用域已經(jīng)存在了,書(shū)寫(xiě)完一個(gè)函數(shù)就確定了函數(shù)自己的作用域。那么作用域鏈呢?當(dāng)然是執(zhí)行上下文壓棧是才存在的。原型鏈也是函數(shù)寫(xiě)完時(shí)他就已經(jīng)存在了,和是否調(diào)用該函數(shù)并無(wú)關(guān)系。
感謝各位看官至此,希望批評(píng)指正。
參考資料:
JavaScript高級(jí)程序設(shè)計(jì)第3版
深入理解javascript原型和閉包(完結(jié))
(圖片來(lái)源于網(wǎng)絡(luò))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/102164.html
摘要:在這個(gè)情況下我們可能需要使用構(gòu)造函數(shù),其以指定的模式來(lái)創(chuàng)造對(duì)象。構(gòu)造函數(shù)也有自己的,值為,也通過(guò)其屬性關(guān)聯(lián)到。從邏輯上來(lái)說(shuō),這是以棧的形式實(shí)現(xiàn)的,它叫作執(zhí)行上下文棧。 原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 對(duì)象 原型鏈 構(gòu)造函數(shù) 執(zhí)行上下文棧 執(zhí)行上下文 變量對(duì)象 活動(dòng)對(duì)象 作用域鏈 閉包 Thi...
摘要:每一個(gè)執(zhí)行上下文可以訪問(wèn)的對(duì)象包括自身的作用域和父執(zhí)行上下文的作用域和父父執(zhí)行上下文作用域直到全局作用域,這就產(chǎn)生了作用域鏈。語(yǔ)句結(jié)束后,作用域鏈恢復(fù)正常。 0、自己理解 代碼執(zhí)行或函數(shù)調(diào)用生成執(zhí)行上下文(只有當(dāng)前執(zhí)行上下文有執(zhí)行權(quán)),該執(zhí)行上下文內(nèi)只能訪問(wèn)當(dāng)前執(zhí)行上下文的變量、函數(shù)和上一級(jí)執(zhí)行上下文中的變量、函數(shù),激活下一個(gè)執(zhí)行上下文的時(shí)候執(zhí)行權(quán)轉(zhuǎn)移到新的執(zhí)行上下文,形成執(zhí)行上下文棧...
摘要:對(duì)于直接量和局部變量的訪問(wèn)性能差異微不足道,性能消耗代價(jià)高一些的是全局變量數(shù)組項(xiàng)對(duì)象成員。當(dāng)一個(gè)函數(shù)被創(chuàng)建后,作用域鏈中被放入可訪問(wèn)的對(duì)象。同樣會(huì)改變作用域鏈,帶來(lái)性能問(wèn)題。 早前閱讀高性能JavaScript一書(shū)所做筆記。 一、Loading and Execution 加載和運(yùn)行 從加載和運(yùn)行角度優(yōu)化,源于JavaScript運(yùn)行會(huì)阻塞UI更新,JavaScript腳本的下載、解析...
摘要:對(duì)于直接量和局部變量的訪問(wèn)性能差異微不足道,性能消耗代價(jià)高一些的是全局變量數(shù)組項(xiàng)對(duì)象成員。當(dāng)一個(gè)函數(shù)被創(chuàng)建后,作用域鏈中被放入可訪問(wèn)的對(duì)象。同樣會(huì)改變作用域鏈,帶來(lái)性能問(wèn)題。 早前閱讀高性能JavaScript一書(shū)所做筆記。 一、Loading and Execution 加載和運(yùn)行 從加載和運(yùn)行角度優(yōu)化,源于JavaScript運(yùn)行會(huì)阻塞UI更新,JavaScript腳本的下載、解析...
摘要:下面我跟大家分享關(guān)于標(biāo)識(shí)符查找方面的優(yōu)化問(wèn)題。這個(gè)變量對(duì)象會(huì)首先被放入作用域鏈中。執(zhí)行上下文也有一個(gè)作用域鏈,這個(gè)作用域鏈就是用來(lái)進(jìn)行變量查找的。當(dāng)執(zhí)行上下文創(chuàng)建時(shí),它的作用域鏈會(huì)用函數(shù)的屬性來(lái)初始化。 前面兩篇文章介紹了Javascript文件在頁(yè)面中位置以及異步加載問(wèn)題對(duì)前端性能的影響。不過(guò)受限于單線(xiàn)程的原因,不管采用哪種方法,只要Javascript進(jìn)行了耗時(shí)的工作,就都會(huì)引...
閱讀 3021·2021-11-12 10:36
閱讀 4726·2021-09-22 10:57
閱讀 1558·2021-09-22 10:53
閱讀 2636·2019-08-30 15:55
閱讀 3493·2019-08-29 17:00
閱讀 3352·2019-08-29 16:36
閱讀 2463·2019-08-29 13:46
閱讀 1348·2019-08-26 11:45