最開始關於call、apply、bind函數的使用時,總是很模糊,不知道用哪一個,this指向問題等,看了一些別人的總結後有了一定的理解,所以特地記錄一下: 要搞清楚call、apply、bind我們從三個問題入手,解決了三個問題這三個方法也差不多了 1:為啥我們生產過程中會用到call、apply ...
最開始關於call、apply、bind函數的使用時,總是很模糊,不知道用哪一個,this指向問題等,看了一些別人的總結後有了一定的理解,所以特地記錄一下:
要搞清楚call、apply、bind我們從三個問題入手,解決了三個問題這三個方法也差不多了
1:為啥我們生產過程中會用到call、apply、bind及它們到底是幹嘛的
2:它們具體怎麼使用
3:三個有沒有什麼區別
接下來我們說一個場景:有一天一個山大王(oldMan)帶著小羅羅們在巡山,手裡是一把大刀,逛著逛著突然停下了腳步,為啥?因為他們看見一個人(newMan)正在拉弓準備射擊遠處的一隻肥壯的山雞,一瞬間newMan射中了那隻山雞興高采烈的準備 烤山雞,山大王羡慕極了,因為自己也發現了一隻山雞可惜沒有弓箭。可是自己手裡只有一把大刀根本抓不止山雞,這時候小羅羅有的說直接把弓箭搶過來然後射擊山雞,有的說暴力不好最好是先借一下弓箭,射擊山雞後再還給他就是。
山大王做法1:直接搶過來用,不還了----bind。
山大王做法2:先借用一下,用完就還----call
山大王做法2:先借用一下,用完就還----apply(就是傳參數方式是數組而已和call沒啥區別)
最後我們來說一下一開始提到的三個問題:
先把三個方式放在一起:
newMan.getChicken.bind(oldMan)(3);//射擊的山雞為:old chicken 射擊了3次
newMan.getChicken.call(oldMan,3);//射擊的山雞為:old chicken 射擊了3次
newMan.getChicken.apply(oldMan,[3]);//射擊的山雞為:old chicken 射擊了3次
1為啥要用bind、call、apply。就是自己解決不了,但是別人能解決,把別人的方法或搶過來(bind綁定),或借過來使用一下下(call、apply,能用但是自己對象里任然沒有這個方法),這也解決了 this指向問題:
bind: 強行把當前使用該方法的對象指向了自己,講白了就是把方法強行放進自己的作用域里了,bind只幹了這些事情,但是像用方法,得再加()調用
call: call就是直接執行一個自己指定this指向的函數,參數是一個一個傳遞。感覺像是人家調用自己的方法時趁機偷到自己的懷抱里
apply: 同上,就是參數是數組形式而已
2 使用方法上面說了
3 區別在1中說了
如果有理解錯誤的地方希望大家批評指正,謝謝。
結語:點點滴滴,慢慢積累,平生多閱歷,胸中有丘壑。