一塊兒再看執行上下文/做用域鏈/原型鏈

做爲小白入坑的這段時間,這三個概念很早便深刻我心,可是卻總感受模模糊糊不知道該怎麼講清楚其中的關係,甚至有時候還會混淆,正好今天拿出來覆盤一下。javascript

舉三個栗子

執行上下文

簡單直白的講執行上下文就是一種環境。html

類比一個賣豬肉的宇宙人小明,小明今天想要賣豬肉,那麼首先宇宙是最根本的環境,在宇宙茫茫星海中他選擇了在地球上賣,因此他來到了地球,在地球這麼多的地方選擇了中國某縣的豬肉鋪。至此他就開始賣豬肉了。你想一想看,很大的空間裏,小明先把宇宙壓入棧底,然後把存在與其中的地球又壓入棧內,而後又把地球中的中國某縣壓入棧內部。是否是很像執行環境的壓棧操做?當他在某縣賺夠了碼農的錢後被宇宙警察發現非法賣肉,便準備溜了,先從某縣走出,而後逃離地球,最後跑出宇宙。java

出入棧
(出入棧操做)網絡

在每一個執行上下文環境中都會提供一些變量。這是否是很像每一個環境獨有的物質基礎?好比在地球這個執行上下文環境中還有其餘一些地方可供選擇,在某縣賣肉的時候你須要的砍刀不就是這個環境提供給你的變量?閉包

回顧一下:每一個執行上下文是一種環境,這種環境有大有小(大小指的是內部包含的變量多少)在調用某個函數時就將這個函數的執行上下文壓入棧中,同時執行上下文中的變量對象被激活可用變爲活動變量。函數調用完畢就把此函數的執行上下文出棧,固然連同這個環境中的變量對象一塊兒被踢出局,同時激活當前棧頂的執行上下文的變量對象。函數


做用域鏈

做用域鏈就是一種尋找變量的鏈條關係,每一個執行上下文中包含本環境中的變量對象並建立鏈條指向他的前一做用域。spa

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

做用域鏈

至此,咱們來分析一下:小明殺豬妖就是調用某個函數解決實際需求,可是他須要某個獨一無二的寶刀(變量),在中國某縣並未找到(當前做用域中並無定義此變量),因而他不得已在地球範圍內尋找(順着做用域鏈條在前一做用域中尋找),在地球中找到了!(前一做用域中找到了此變量),因而愉快的殺豬去了(找到了變量順利解決了實際需求)。設計

回顧一下:做用域鏈是由每一個做用域連接成的呈鏈狀變量對象集合,當前做用域不存在的變量就會依次向前一做用域尋找,直到在根做用域在尋找,而且只能按照必定的順序尋找,不可以逆着順序尋找。htm


原型鏈

原型鏈就是一種對象和建立此對象的對象之間的呈鏈式的關係鏈條。

仍是上個例子吧,小明以爲賣豬肉太不賺錢,因而搞起了養殖業,他從某豬戶中購得一懷了崽的豬,過了幾天便下崽了,因而就變成了豬生豬代代相傳。這個小明發現每一代豬都是倆而且這倆豬還只和他豬爸豬媽交流。

到這你們能夠分析一下:這第一代懷了崽的豬就是null,後期由null產生了object與object.prototype這兩個對象,再由這兩個對象派生出了其餘對象。或許一張圖你會看得更明白。

原型鏈概覽

回顧一下:原型鏈其實就是對象和本身父母的關係,父母在和爺奶的關係。每代之間會有特色添加進去,在你這裏須要調用某個方法你卻沒有時,能夠向上一直找尋找到後調用。


分析關係

紅寶書中講:由多個執行上下文的變量對象構成的鏈表就叫作做用域鏈,因此做用域鏈表的產生是依附於執行上下文的變量對象的,根據每一個執行上下文有本身的做用域,然後根據壓棧的關係組合成做用域鏈表。

原型鏈和他倆不摻合,原型鏈其實在構造對象的過程當中就已經產生了,除非手動的修改他的原型,這也是咱們平時在調用一些自帶的API,並無寫具體實現卻能正常跑下來的緣由。

試想一下:如今寫了一個函數,並無調用這個函數,那麼如今有執行上下文嗎?如今有做用域嗎?如今有做用域鏈嗎?如今有原型鏈嗎?

執行上下文沒有,執行上下文是調用時產生的。做用域已經存在了,書寫完一個函數就肯定了函數本身的做用域。那麼做用域鏈呢?固然是執行上下文壓棧是才存在的。原型鏈也是函數寫完時他就已經存在了,和是否調用該函數並沒有關係。

感謝各位看官至此,但願批評指正。

參考資料:

  1. JavaScript高級程序設計第3版
  2. 深刻理解javascript原型和閉包(完結)

(圖片來源於網絡)

相關文章
相關標籤/搜索