js实现柯里化

柯里化

定义:把一个多参数的函数转化为单参数函数的方法。

  • js实现无函数版本的柯里化

例子:curryingadd(2)(1, 3, 4)(2, 3)(3)(4, 6)(7, 98);

function curryingadd() {
    let args = Array.from(arguments);
    let innerAdd = function () {
      let argsinner = Array.from(arguments);
      // 如果此时内部没有参数了也就是 f(...arg)() 就直接返回值即可
      if (argsinner.length == 0) {
        return args.reduce((prev, cur) => {
          return prev + cur;
        });
      } else {
        // 这里使用了闭包 因为args是外部定义的 所以递归时可以累计存储变量
        args.push(...arguments);
        return innerAdd;
      }
    };
    innerAdd.toString = function () {
      return args.reduce((prev, curr) => {
        return prev + curr;
      }, 0);
    };
    return innerAdd;
  }
   let res = curryingadd(2)(1, 3, 4)(2, 3)(3)(4, 6)(7, 98);//133
   let res1= curryingadd(2)(1, 3, 4)(2, 3)(3)(4, 6)(7, 98)();
   
  • js实现函数版本的柯里化

如:curry(add1)(1, 2)(3)

function add1(x, y, z) {
return x + y + z;
}

const curry = (fn, ...args) => 
// 函数的参数个数可以直接通过函数数的.length属性来访问
args.length >= fn.length // 这个判断很关键!!!
// 传入的参数大于等于原始函数fn的参数个数,则直接执行该函数
? fn(...args)
/**
 * 传入的参数小于原始函数fn的参数个数时
 * 则继续对当前函数进行柯里化,返回一个接受所有参数(当前参数和剩余参数) 的函数
*/
: (..._args) => curry(fn, ...args, ..._args);

console.log(curry(add1)(1, 2)(3));//6

挑战更文100天-----第二天


版权声明:本文为weixin_46015250原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。