43.函数柯里化(currying)

46 阅读1分钟

最开始听到函数柯里化的时候有一种很高端的感觉,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);