柯里化(Currying)函数 如何通过闭包实现参数复用?

作者:袖梨 2026-06-20
柯里化函数通过闭包保存已传入参数实现复用,每次调用返回新函数并累积参数,参数数量达fn.length时执行fn.apply(this, args),支持多参数传入与this绑定。

柯里化函数通过闭包保存已传入的参数,让后续调用能“记住”之前传的值,从而实现参数复用。

闭包捕获前置参数

每次调用柯里化函数时,它不立即执行原函数,而是返回一个新函数。这个新函数内部形成闭包,把之前传入的参数存起来,等待后续参数补全。

  • 例如 add(1)(2)(3) 中,add(1) 返回的函数记住了 1(2) 再记下 2;最后 (3) 拿到全部参数并计算
  • 闭包变量(如数组或累加参数)在多次嵌套调用中持续存在,不会被释放

递归返回函数直到参数足够

柯里化函数通常判断当前收集的参数数量是否达到原函数要求的形参个数。没满就继续返回函数;满了就执行原逻辑。

  • fn.length 获取目标函数期望参数个数
  • 每次调用都把新参数追加到已存参数列表中
  • 参数够了就用 fn.apply(this, args) 执行,否则返回自身(带已有参数的闭包)

支持多方式调用和参数合并

实际柯里化常允许一次传多个参数(如 add(1, 2)(3)add(1)(2, 3)),靠闭包维护统一参数队列。

  • 内部用数组累积所有传入参数,不依赖调用次数
  • 每次返回的函数仍持有该数组引用,后续调用继续往里推
  • 最终执行前展开整个数组,保证顺序和完整性

绑定上下文避免 this 丢失

如果原函数依赖 this,柯里化过程需确保闭包内正确保留调用时的上下文。

  • 常用 bind 或箭头函数维持 this 指向
  • 更稳妥的做法是在最外层保存 thisArg,每次执行都显式传入
  • 比如 curry(fn).call(obj, 1)(2) 要让 fn 内部的 thisobj

相关文章

精彩推荐