關(guān)于JS當(dāng)中的call隶糕,apply和bind瓷产,相信大家和我一樣,已經(jīng)看過(guò)了無(wú)數(shù)篇相關(guān)的文章枚驻,都有自己的理解濒旦。所以這篇文章并非什么科普類(lèi)的文章,僅僅是把我自己的理解記錄下來(lái)再登。
我的學(xué)習(xí)習(xí)慣尔邓,是喜歡把各種看似孤立的知識(shí)點(diǎn)串聯(lián)起來(lái),綜合理解并運(yùn)用锉矢,通過(guò)最簡(jiǎn)單最直觀的思路把它理解透梯嗽。所以,這篇文章將通過(guò)一段非常簡(jiǎn)潔的等式沽损,把JS當(dāng)中一個(gè)相對(duì)較難的知識(shí)點(diǎn)灯节,call,apply和bind給串聯(lián)起來(lái):
要理解JS當(dāng)中的這三個(gè)關(guān)鍵字绵估,首先得弄清楚它們是用來(lái)干嘛的炎疆。復(fù)雜些來(lái)說(shuō),可以引用MDN文檔的原文:
簡(jiǎn)單些來(lái)說(shuō)国裳,可以引用大家都看過(guò)的一句話:
又或者是
上面這些解釋都很正確形入,說(shuō)得一點(diǎn)問(wèn)題都沒(méi)有,但是里面卻又引入了
這個(gè)貓對(duì)象擁有一個(gè)抓老鼠的技能catchMouse()
缝左。
然后類(lèi)似的唯笙,定義一個(gè)狗對(duì)象:
這個(gè)狗對(duì)象能夠咬壞人biteCriminal()
螟蒸。
接下來(lái),我們實(shí)例化兩個(gè)對(duì)象崩掘,分別得到一只叫“Kitty”的貓和叫“Doggy”的狗:
首先讓它們彼此發(fā)揮自己的技能:
現(xiàn)在,我們希望賦予Doggy抓老鼠的能力少办,如果不使用這三個(gè)關(guān)鍵字苞慢,應(yīng)該怎么做呢?
方案A:修改Dog對(duì)象英妓,直接為其定義一個(gè)和Cat相同的抓老鼠技能挽放。
方案B:讓Doggy吃掉Kitty,直接消化吸收Kitty的所有能力蔓纠。
其實(shí)方案A和方案B的解決辦法是類(lèi)似的辑畦,也是需要修改Dog對(duì)象,不過(guò)方案B會(huì)更簡(jiǎn)單粗暴一點(diǎn):
上面這種方法實(shí)在是太不優(yōu)雅腿倚,往往很多時(shí)候在定義Dog對(duì)像的時(shí)候根本就沒(méi)有打算過(guò)要為它添加抓老鼠的方法纯出。那么有沒(méi)有一種辦法能夠在不修改Dog對(duì)象內(nèi)容的前提下,讓Doggy實(shí)例也能夠擁有抓老鼠的辦法呢敷燎?答案就是使用call暂筝,apply或者bind關(guān)鍵字:
反過(guò)來(lái),讓Kitty擁有咬壞人的能力硬贯,也可以通過(guò)這種辦法實(shí)現(xiàn)焕襟,讀者可以自行嘗試。
看到這里饭豹,相信讀者已經(jīng)能夠明白call鸵赖,apply和bind的區(qū)別及作用,反過(guò)來(lái)再查看各自的概念拄衰,應(yīng)該也能夠更容易理解它褪。
回到文章開(kāi)頭的等式:
這里的“等號(hào)”其實(shí)并不嚴(yán)謹(jǐn),因?yàn)槿齻€(gè)關(guān)鍵字的區(qū)別及背后的原理肯定不是區(qū)區(qū)一個(gè)等號(hào)就能夠概括的肾砂,但是對(duì)于概念的理解以及實(shí)際情況下的運(yùn)用來(lái)說(shuō)列赎,這條等式未必不是一個(gè)好的思路。