概念
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数;
降低函数的通用性,提高函数的适用性。
主要使用场景
通过将函数的部分参数进行预处理,得到一个在某个时刻(runtime)固定参数的方法,该方法的调用者只需关系剩余参数的传入。
处理已知的参数得到一个方法,等待参数全部确定后返回结果。
假如不同组件同时引用某个公共方法,而公共方法内部根据不同参数处理不同场景的业务逻辑,此时可以将函数处理不同场景的参数通过柯里化得到应用于不同场景的方法,提供给组件调用时,组件就不需要关心需要传入哪种不一样的参数去处理当前的业务逻辑了。
代码实现
function curry(func) {
// 返回一个可以调用的函数
// 并将传入的参数使用拓展运算符转化为真正的数组
return function curried(...args) {
// 对比传入的参数与func形参的数量
// 如果传入的参数数量大于或等于func的形参
if (args.length >= func.length) {
// 则返回func执行的结果
return func.apply(this, args);
} else {
// 否则继续返回一个函数
// 这个函数继续接收传入的参数
return function(...args2) {
// 将两次的参数使用concat连接起来
// 然后递归执行curried
return curried.apply(this, args.concat(args2));
}
}
};
}
function A(a, b, c) {
return a + b + c
}
const CA = curry(A);
const res1 = CA(1)(2)(3); // 6
const res2 = CA(1)(2, 3); // 6