概念:柯理化固定了你函數的某一個或幾個參數,返回一個新的函數,接收剩下的參數, 參數個數多是 1 個,也多是 2個,甚至更多,調用方式由 f(a, b) 轉換爲 f(b) 方式調用, a 已經做爲參數包裝到偏函數當中。bash
偏函數的實現和 bind 實現方式相似。閉包
function mul(a, b){
return a * b;
}
// 實現一個雙倍的函數
// 綁定上下文 this 爲 undefined
let double = mul.bind(undefined, 2);
double(3) // 6
複製代碼
這裏利用了閉包的原理,double 函數其實是函數
function double(...args){
var a = 2;
return mul(a, ...args)
}
複製代碼
這樣作的好處是能夠將一些參數給包裝到函數中,後面只須要調用其餘參數,不用重複傳入包裝的參數,包裝的參數能夠有多個。ui
// func 目標函數
// argsBound 要包裝的參數,能夠有多個
function partial(func, ...argsBound) {
return function(...args) { // (*)
return func.call(this, ...argsBound, ...args);
}
}
function mul(a, b){
return a * b;
}
let partialMul = partial(mul, 5)
partialMul(2) // 10
複製代碼
loadsh 庫也提供了 _.partial 的實現。this
概念:柯理化是把一個有 n 個參數的函數變成 n 個只有 1 個參數的函數,調用方式由 f(a, b, c) 轉換爲 f(a)(b)(c) 方式調用。spa
function sum(a, b){
return a + b;
}
// 柯里化函數
function curry(func){
return function(a){
return function(b){
return func(a,b)
}
}
}
// 返回的是一個函數
let currySum = curry(sum);
currySum(1)(2) // 3
複製代碼
僅針對函數參數長度固定 柯里化須要函數有已知的參數數量是固定的。code
但在JavaScript中的函數大多數實現是超越定義的,也能夠讓函數使用多個參數變量執行。例如 console.log() ,後面能夠研究一下這個是怎麼實現的。ip
柯里化的高級實現,如 lodash 中的 _.curry 能夠實現更復雜的功能。io
總結:console