柯里化核心是参数分步传递与函数结构转换,不缓存计算结果;它通过闭包保存已传参数构造新函数,重点在“分步传参”而非“记忆结果”,真正缓存结果的是记忆化(memoization)。

柯里化本身不是用来缓存计算结果的设计模式,它核心是参数分步传递与函数结构转换,不涉及结果缓存。把“利用闭包缓存计算结果”当作柯里化的定义,属于常见误解。
柯里化的真实作用是参数拆解与复用
它通过闭包保存已传入的参数,构造出接收剩余参数的新函数,重点在“分步传参”而非“记忆结果”。比如:
-
固定前序参数:
const add10 = curryAdd(10)得到一个始终加10的函数,后续调用add10(5)返回15;这里闭包保存的是10,不是add10(5)的结果。 -
生成专用函数:用
curryCheck(/\d+/g)创建hasNumber,每次调用都重新执行正则匹配,不记住上次匹配结果。
容易混淆的其实是记忆化(Memoization)
真正利用闭包缓存函数执行结果的是记忆化,和柯里化无关。例如:
- 对
fibonacci(n)做记忆化,会把fib(5)=5存起来,下次再算fib(5)直接返回,跳过计算。 - 柯里化后的函数若没额外加记忆逻辑,同一输入仍会重复执行原函数体。
两者可以共存,但逻辑独立
你完全可以先柯里化一个函数,再对其某一层返回的函数做记忆化,但这属于组合使用:
- 柯里化负责把
sum(a, b, c)变成sum(a)(b)(c); - 记忆化负责让
sum(1)(2)这个中间函数记住c=3时的结果,下次传3就不重算。
为什么有人会搞混
因为两者都依赖闭包,且常出现在函数式编程的同一类教程里:
- 柯里化用闭包“存参数”,为后续调用准备上下文;
- 记忆化用闭包“存返回值”,为后续相同输入节省计算。











