JS中使用apply、bind實現(xiàn)為函數(shù)或者類傳入動態(tài)個數(shù)的參數(shù)
為紀念10年沒寫blog,第一篇博文就以這樣一個有趣的竅門開始吧 -___-
在ES5中,當我們調(diào)用一個函數(shù)時,如果要傳入的參數(shù)是根據(jù)其他函數(shù)或條件判斷生成的,也就是說不確定會傳入多少個參數(shù)時,在不改變原函數(shù)的情況下該如何辦呢?
(當然了,能避免此文所述情況發(fā)生就盡量避免,比如將參數(shù)改為object或array等等)
大部分人可能知道用apply能完美解決這個問題:
apply與call一樣會將第一個參數(shù)作為函數(shù)的調(diào)用對象,即改寫了調(diào)用函數(shù)內(nèi)的this指針為第一個參數(shù),如果不是對象的方法,可以不考慮this,傳入一個null即可。
而不同之處在于后面的參數(shù),apply將所有要傳入調(diào)用函數(shù)的參數(shù)放在一個數(shù)組中,call是與原函數(shù)一樣依次追加進去。
既然是數(shù)組那就可控了,根據(jù)其他函數(shù)或邏輯判斷來生成數(shù)組,可達到傳入動態(tài)個數(shù)參數(shù)的目的。
但是我遇到一個頭疼的問題,要在用new創(chuàng)建對象時傳入動態(tài)個參數(shù),幾年才遇到一次的問題:
如果是用ES6,有了rest參數(shù),上述問題全都不是問題。注意,數(shù)組args前面加三個點并不是語法錯誤,而是ES6提供的rest參數(shù)寫法,你可以理解為將...args替換為args數(shù)組去掉方括號后的字符。
但ES5里真的就沒有辦法實現(xiàn)了嗎?畢竟ES6大部分都是語法糖,可以用babel一類的工具編譯為ES5,帶著疑問,我們就用babel編譯一下看看得到什么:
看到最后一行驚呆了,別害怕,讓我們分析一下這句代碼。首先肢解一下,分三步來看:
1. 毫無疑問,用concat將null與我們的參數(shù)連接為一個數(shù)組,作為apply第二個參數(shù),即得到[null, 1, 2, 3];
2. 讓我們運算一下apply,第一個參數(shù)Foo會取代Function來調(diào)用原生的bind方法,第二個參數(shù)數(shù)組的內(nèi)容將作為bind的參數(shù)傳入,即得到Foo.bind(null, 1, 2, 3);
3. bind方法第一個參數(shù)與apply、call類似,修改this指針,而后面的參數(shù)可以為函數(shù)植入默認的前置參數(shù)值(preset leading argument),也就是說當bind執(zhí)行完后在第一組小括號內(nèi)我們得到一個已經(jīng)注入了三個參數(shù)值的Foo類,暫且叫FooWithArgs;
最終,當我們 new FooWithArgs(); 時,就不用傳入任何參數(shù)了。等同于 new Foo(1, 2, 3);
- AngularJS報錯$apply already in progress的解決方法分析
- AngularJS中$apply方法和$watch方法用法總結(jié)
- 詳解js中的apply與call的用法
- JS中使用apply方法通過不同數(shù)量的參數(shù)調(diào)用函數(shù)的方法
- 有關(guān)JavaScript中call()和apply() 的一些理解
- AngularJS中的$watch(),$digest()和$apply()區(qū)分
- JS中改變this指向的方法(call和apply、bind)
- js中apply和Math.max()函數(shù)的問題及區(qū)別介紹
相關(guān)文章
使用formatter函數(shù)設(shè)置Echarts的tooltip中動態(tài)單位
這篇文章主要為大家介紹了使用formatter函數(shù)設(shè)置Echarts的tooltip中動態(tài)單位實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07JS腳本加載后執(zhí)行相應(yīng)回調(diào)函數(shù)的操作方法
本文主要講解怎么在成功加載 js 文件后再執(zhí)行相應(yīng)回調(diào)任務(wù),對JS腳本加載后執(zhí)行相應(yīng)回調(diào)函數(shù)的操作方法感興趣的朋友,通過本文學(xué)習(xí)下吧2018-02-02javascript實現(xiàn)復(fù)選框超過限制即彈出警告框的方法
這篇文章主要介紹了javascript實現(xiàn)復(fù)選框超過限制即彈出警告框的方法,涉及復(fù)選框及警告框的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-02-02