看了網(wǎng)上的一些文章,感覺說的不夠詳盡。所以專門分三方面測試了三者區(qū)別。
先說相同點
call、apply、bind都可以傳入this對象和執(zhí)行參數(shù)。
區(qū)別在于,call、bind的執(zhí)行參數(shù)使用可變參數(shù)的形式傳入,apply的執(zhí)行參數(shù)使用數(shù)組的形式傳入。
從這一點上看,似乎還缺一個applyBind函數(shù)(執(zhí)行參數(shù)用數(shù)組形式傳入的bind)。
接著我們看一下不同點
返回值
apply、call沒有返回值,bind有返回值。
執(zhí)行時機
apply、call立刻執(zhí)行;bind只返回新函數(shù),不執(zhí)行,直到調(diào)用返回的新函數(shù)才執(zhí)行
返回值和執(zhí)行時機的區(qū)別,可以通過下圖的代碼查看

作用周期
call、apply只對本次執(zhí)行有效,bind的返回函數(shù)長久有效,且不可更改。
如下圖代碼,當bind綁定了參數(shù)后,即使在執(zhí)行時設(shè)置新的參數(shù),但是實際使用的仍然時綁定時的參數(shù)

如果,我們對bind的函數(shù),使用call再次修改this對象和參數(shù)會發(fā)生什么?
參考下圖代碼,只要bind后,即使再次call,也無法改變bind的this對象和執(zhí)行參數(shù)。
可見,bind()函數(shù)返回的對函數(shù)對象,this和執(zhí)行參數(shù)都是無法修改的。

換另一種方法,試圖修改bind的this對象,結(jié)果也是失敗的,如下圖

最后,嘗試對bind過的函數(shù)進行二次bind,會發(fā)現(xiàn)二次bind也無法改變this對象和參數(shù),如下圖
