手写 curry 函数,实现函数柯里化

function curry(fn: Function) {
  const fnArgsLength = fn.length // 传入函数的参数长度
  let args: any[] = [];
  function calc(this: any, ...newArgs: any[]) {
    // 积累参数
    args = [
      ...args,
      ...newArgs
    ]
    if (args.length < fnArgsLength) {
      // 参数不够,返回函数
      return calc
    } else {
      // 参数够了,返回执行结果
      return fn.apply(this, args.slice(0,fnArgsLength))
    }
  }
  return calc
}

function add(a: number, b: number, c: number) {
  return a + b + c
}
add(10, 20, 30)  // 60

const curryAdd = curry(add)
curryAdd(10)(20)(30)
  • curry 返回的是一个函数 fn
  • 执行 fn ,中间状态返回函数,如 add(1) 或者 add(1)(2)
  • 最后返回执行结果,如add(1)(2)(3)

  • 工作不常用,面试很爱考
  • 如果有 this,慎用箭头函数