最开始听到函数柯里化的时候有一种很高端的感觉,currying简单的说就是:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。你可以一次性地调用 curry 函数,也可以每次只传一个参数分多次调用。
比如我要实现一个叠加的功能,定义一个函数add,我可以传入3个参数1,2,3 add(1,2,3) 结果是6,当我们使用柯里化的话可以写成 add(1)(2)(3)
addCurrying 函数接受一个参数并返回一个新的函数。调用 addCurrying 之后,返回的函数就通过闭包的方式记住了 addCurrying 的第一个参数x。currying函数可以复用一些传入的参数,形成闭包保存在函数内,调用时只需要传入变化的数据。
function curryFn(fn, currArgs) {
return function (...args) {
// 首次调用时,若未提供最后一个参数currArgs
// 则不进行args的拼接
if (currArgs !== undefined) {
args = args.concat(currArgs);
}
// 递归调用
if (args.length < fn.length) {
return curryFn(fn, args);
}
// 递归出口
return fn.apply(null, args);
};
}
function sum(a, b, c) {
return a + b + c;
}
const fn = curryFn(sum);
let res = fn(1, 2, 3); // 6
let res2 = fn(1)(2)(3); // 6
console.log(res, res2);