函数柯里化

216 阅读1分钟

思路:

  • 就是把传入的参数存放起来
  • 参数传够了, 执行回调
  • 参数不够, 返回函数

写法1

function curry(cb: Function) {
  let args: any[] = [];

  function fn(...more: any[]) {
    args = [...args, ...more];

    if (args.length >= cb.length) {
      return cb(...args);
    }

    return fn;
  }

  return fn;
}

测试

function sum(a: number, b: number, c: number) {
  return a + b + c;
}

let curSum = curry(sum);
console.log(curSum(1,2)(3));

写法2: 加强版

function curry(fn, ...args) {
  if(args.length >= fn.length) {
    return fn(...args)
  }
  return (...more) => {
    return curry(fn, ...args, ...more)
  }
}

测试

function sum(a, b, c) {
  return a + b + c;
}

let curSum = curry(sum);
console.log(curSum(1)(2)(3));
console.log(curSum(1)(2, 3)); // 写法1这里会报错
console.log(curSum(1, 2, 3));// 写法1这里会报错
console.log(curry(sum)(1)(2, 3));// 写法1这里会报错