本文實例講述了JavaScript偏函數與柯里化。分享給大家供大家參考,具體如下:
到目前為止我們僅討論綁定this,現在讓我們更深入學習。
我們不僅能綁定this,也可以是參數,這較少使用,但有時很方便。
bind完整的語法為:
let bound = func.bind(context, arg1, arg2, ...);
可以綁定上下文this和函數的初始參數。舉例,我們有個乘法函數mul(a,b):
function mul(a, b) { return a * b;}我們可以在該函數的基礎上使用綁定創建一個double函數:
let double = mul.bind(null, 2);alert( double(3) ); // = mul(2, 3) = 6alert( double(4) ); // = mul(2, 4) = 8alert( double(5) ); // = mul(2, 5) = 10
調用mul.bind(null, 2)創建新函數double,傳遞調用mul函數,固定第一個參數上下文為null,第二個參數為2,多個參數傳遞也是如此。
這稱為偏函數應用——我們創造一個新函數,讓現有的一些參數值固定。
注意,這里確實不用this,但bind需要,所以必須使用null。
在下面代碼中函數triple實現乘以3的功能:
let triple = mul.bind(null, 3);alert( triple(3) ); // = mul(3, 3) = 9alert( triple(4) ); // = mul(3, 4) = 12alert( triple(5) ); // = mul(3, 5) = 15
為什么我們通常使用偏函數?
這里我們偏函數的好處是:通過創建一個名稱易懂的獨立函數(double,triple),調用是無需每次傳入第一個參數,因為第一個參數通過bind提供了固定值。
另一種使用偏函數情況是,當我們有一個很通用的函數,為了方便提供一個較常用的變體。
舉例,我們有一個函數send(from, to, text),那么使用偏函數可以創建一個從當前用戶發送的變體:sendTo(to, text)
使用沒有上下文的偏函數
如果想固定一些參數,但不綁定this呢?
內置的bind不允許這樣,我們不能忽略上下文并跳轉到參數。幸運的是,可以僅綁定參數partial函數容易實現。
如下:
function partial(func, ...argsBound) { return function(...args) { // (*) return func.call(this, ...argsBound, ...args); }}// Usage:let user = { firstName: "John", say(time, phrase) { alert(`[${time}] ${this.firstName}: ${phrase}!`); }};// add a partial method that says something now by fixing the first argumentuser.sayNow = partial(user.say, new Date().getHours() + ':' + new Date().getMinutes());user.sayNow("Hello");// Something like:// [10:00] Hello, John!調用partial(func[, arg1, arg2...])函數的結果為調用func的包裝器(*號行):
新聞熱點
疑難解答
圖片精選