简单手写 curry 柯里化

Huy小于 1 分钟javascriptjavascript

function curry(fn) {
  return function curried(...args) {
    // 如果参数够了,直接执行
    if (args.length >= fn.length) {
      return fn.apply(this, args)
    }

    // 不够就继续返回函数收集参数
    return function (...nextArgs) {
      return curried.apply(this, args.concat(nextArgs))
    }
  }
}
/**
 * 手写柯里化
 */

function curry(fn: Function) {
  // 获取传入函数的参数长度
  const fnArrayLength = fn.length
  let args: any[] = []

  // 在 ts 中, 独立的函数的 this 要声明类型, 不会编译到 js 中
  function calc(this: any, ...newArgs: any[]) {
    // 积累参数
    args = [...args, ...newArgs]

    if (args.length < fnArrayLength) {
      // 参数不够, 返回函数
      return calc
    } else {
      // 参数够了, 返回执行结果
      return fn.apply(this, args.slice(0, fnArrayLength)) // 参数进行截断, 防止参数过多
    }
  }
  return calc
}

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

const res = curry(add)
console.info(res(1)(2)(3))
Loading...