Skip to content

柯里化

创建一个函数,该函数接收 func 的参数,要么调用 func 返回的结果,如果 func 所需参数已经提供,则直接返回 func 所执行的结果。或返回一个函数,接受余下的 func 参数的函数,可以使用 func.length 强制需要累积的参数个数。

js
function curry(fn, ...args) {
  return function (...args2) {
    const allArgs = args.concat(args2)
    if (allArgs.length >= fn.length) {
      return fn.apply(this, allArgs)
    } else {
      return curry(fn, ...allArgs)
    }
  }
}
js
function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args)
    } else {
      return function (...args2) {
        return curried.apply(this, args.concat(args2))
      }
    }
  }
}
示例
js
const sum = (a, b, c, d) => a + b + c + d

console.log(curry(sum)(1)(2)(3)(4)) // 输出 10
console.log(curry(sum)(1, 2)(3, 4)) // 输出 10
console.log(curry(sum)(1, 2, 3)(4)) // 输出 10
console.log(curry(sum)(1, 2, 3, 4)) // 输出 10

基于 MIT 许可发布