精通「JavaScript系列」,詳解知識(shí)體系,等你開吃
摘要
JS中的函數(shù)調(diào)用,通常是使用函數(shù)名加上參數(shù)即可實(shí)現(xiàn)函數(shù)的調(diào)用,但在有些情況下,也會(huì)用到call、apply、bind實(shí)現(xiàn)函數(shù)的調(diào)用。其中call和apply的調(diào)用方法類似,只是call參數(shù)與普通函數(shù)調(diào)用類似,而apply則是使用數(shù)組能數(shù)進(jìn)行調(diào)用;bind則有點(diǎn)類似將call方法的部分動(dòng)作,下面通過(guò)實(shí)例對(duì)三個(gè)方法進(jìn)行說(shuō)明,如有疑問(wèn)錯(cuò)漏歡迎交流。
正文
JS廣泛應(yīng)用于現(xiàn)代計(jì)算機(jī)多種環(huán)境下,它不僅在Web前端中應(yīng)用廣泛、同時(shí)也在后端服務(wù)和桌面應(yīng)用中應(yīng)用廣泛,如后端Nodejs為主的應(yīng)用服務(wù),可實(shí)現(xiàn)各種應(yīng)用服務(wù),包括業(yè)務(wù)服務(wù)、數(shù)據(jù)存取等,而桌面應(yīng)用如現(xiàn)在開發(fā)環(huán)境編輯器應(yīng)用最為廣泛的visual studio code(簡(jiǎn)稱vscode),就是使用JS開發(fā)的前端工具。
函數(shù)作為JS的主要構(gòu)成部分,舉例如下,求2 個(gè)數(shù)的和:

假設(shè)公司有2個(gè)人,張三和李四,年底要給加薪,我們已經(jīng)做好了加薪的函數(shù)及兩個(gè)人的對(duì)象實(shí)例:


call
如何給兩個(gè)人加薪:
通過(guò)call(obj, args)方法來(lái)調(diào)用加薪函數(shù),其中:
Obj為call綁定的對(duì)象,args則是調(diào)用函數(shù)的參數(shù),如下代碼所示
//假設(shè)每年默認(rèn)加薪10%

apply
使用apply調(diào)用加薪函數(shù),apply(obj, [args]),其中:
Obj為call綁定的對(duì)象,[args]則是調(diào)用函數(shù)的參數(shù),數(shù)組格式,如下代碼所示

bind
bind則是先綁定到某個(gè)對(duì)象上,然后再進(jìn)行調(diào)用


vscode中demo代碼完整截圖:

小結(jié)與思考
以上舉例中僅用了一個(gè)參數(shù)的函數(shù),總結(jié)三種調(diào)用方式對(duì)比。
call : Function.call(obj, args);
apply: Function.apply(obj, [args]);
bind : newFun = Function.bind(obj);//先綁定
newFun(args);// 再調(diào)用
通過(guò)分析其應(yīng)用,對(duì)比似乎apply沒(méi)什么用,還要加個(gè)數(shù)組括號(hào),為什么要多此一舉呢?下面我們?cè)倥e多一個(gè)真實(shí)應(yīng)用的場(chǎng)景,供進(jìn)一步對(duì)比參考,求輸入的數(shù)字中最大值,可以調(diào)用Math.max函數(shù),但當(dāng)無(wú)法確認(rèn)有多少個(gè)輸入數(shù)字時(shí),這時(shí)apply的“動(dòng)態(tài)”參數(shù)調(diào)用就起作用了,如下所示代碼中:


vscode中運(yùn)行截圖

call深度應(yīng)用
如果前面介紹已經(jīng)理解了,那么實(shí)際開發(fā)中也已經(jīng)基本夠用了,但有沒(méi)有更具體的一些應(yīng)用呢,實(shí)際上也可以使用通過(guò)call的調(diào)用父類構(gòu)造實(shí)現(xiàn)“繼承”功能,子類自動(dòng)具有父類的相關(guān)屬性,這個(gè)叫“深度”應(yīng)用有點(diǎn)牽強(qiáng),但做為拋磚引玉來(lái)講吧,舉例如下:



apply深度應(yīng)用
Function.apply(obj, [args])
繼承使用apply實(shí)現(xiàn)
完整代碼如下




[args]的變種替代
可使用一個(gè)擁有l(wèi)ength,及小于length對(duì)應(yīng)的索引對(duì)象來(lái)替代,如前面所述的加薪算法調(diào)用,可以使用以下參數(shù)進(jìn)行替代:

如何將一個(gè)數(shù)組添加到另一個(gè)數(shù)組
直接上代碼:



以上兩個(gè)輸出結(jié)果都是一樣的,但apply方法更加簡(jiǎn)潔清晰,傳統(tǒng)方式使用循環(huán)逐個(gè)元素增加則有點(diǎn)臃腫。
總結(jié)說(shuō)明
以上所有相關(guān)內(nèi)容,在實(shí)戰(zhàn)中都可嘗試思考,找到發(fā)揮各自己功效的應(yīng)用場(chǎng)景,但一般情況下來(lái)講,除去一些必要地高級(jí)應(yīng)用或特定場(chǎng)景應(yīng)用外,還是要記住代碼的本質(zhì),是給人看的,而不是給機(jī)器看的,所以代碼應(yīng)該方便理解,如果太過(guò)高深或不能很容易的方便人們閱讀并理解其中的含義,那么效果也許會(huì)大打折扣。