Skip to content

JavaScript 柯里化(curry)

什么是柯里化(curry)

定义: 是一种将多参数函数,转换成单参数函数的技术。它的核心原理是将一个接受多个参数的函数分解成逐步接受单个参数的函数链,每次返回一个新的函数,直到所有参数都提供后才执行最终计算

原理

  1. 函数分解: 假设一个函数 f(a, b, c) 科里化之后会变成 f(a)(b)(c),每次调用只处理一个参数,并返回一个新函数等待下一个参数
  2. 闭包:柯里化依赖闭包来保存之前的传入的参数。每次返回的新函数都可以访问外层函数的作用域,记住之前传入的参数
  3. 逐步求值:当所有参数都收集齐全之后,柯里化的函数会调用原始函数,并返回结果。

示例

假设有一个求和函数

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

柯里化之后的版本可能是:

js
function curryAdd(a) {
  return function(b) {
    return function(c) {
      return a + b + c
    }
  }
}

调用示例

js
console.log(curryAdd(1)(2)(3)) // 6

通用柯里化函数

示例代码

js
function curry(fn) {
  return function curried(...args) {
    // 参数够了之后执行计算
    if (args.length >= fn.length) {
      return fn(...args)
    }
    // 参数不足时,返回函数
    return function(...nextArgs) {
      return curried(...args, ...nextArgs)
    }
  }
}

测试

js
function add(a, b, c) {
  return a + b + c
}
const curryAdd = curry(add)
console.log(curryAdd(1)(2)(3))
console.log(curryAdd(1,2)(3))
console.log(curryAdd(1)(2,3))