Curry | 柯里化
函数柯里化(curry)是函数式编程里面的概念。curry的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
简单点来说就是:每次调用函数时,它只接受一部分参数,并返回一个函数,直到传递所有参数为止。
柯里化工具函数
/**
* @description: 将函数柯里化的工具函数
* @param { Function } fn 待柯里化的函数
* @param { array } args 已经接收的参数列表
* @return { Function }
*/
const currying = function(fn, ...args) {
// fn需要的参数个数
const len = fn.length;
// 返回一个函数接收剩余参数
return function (...params) {
// 拼接已经接收和新接收的参数列表
let _args = [...args, ...params];
// 如果已经接收的参数个数还不够,继续返回一个新函数接收剩余参数
if (_args.length < len) {
return currying.call(this, fn, ..._args);
}
// 参数全部接收完调用原函数
return fn.apply(this, _args);
}
}
// ex:
function add(a, b, c) {
return a + b + c;
}
const addCurry = currying(add);
console.log(addCurry(1)(2)(3)); // 6
console.log(addCurry(1, 2)(3)); // 6
console.log(addCurry(1)(2, 3)); // 6
柯里化 add 函数
function add(){
let arr = [ ...arguments ];
let _len = arr.length;
// 没有参数,返回结果
if(!_len)return 0;
let _fn = function(){
let _agrs = [ ...arguments ];
if(_agrs.length){
// 有参数,继续缓存参数,返回函数
arr.push(..._agrs);
return _fn;
}else{
// 最后一次调用,处理返回结果
return arr.reduce((a,b)=>a+b);
}
}
return _fn;
};
console.log(add(1)(2)(3)(4)(5)()); // 15
console.log(add(1,2,3)(4)(5)()); // 15
console.log(add()); // 0