柯里化通过闭包固定前置参数实现参数复用,如format('【id】', '')生成idformatter;支持链式分步绑定,如postjson;可与memoize结合缓存最终结果;推荐使用lodash或ramda等成熟工具。

柯里化本身不直接做缓存,但它天然支持参数复用——通过闭包把已传参数“记”在函数内部,后续调用可反复使用这些前置值,无需重复传入。
用闭包固定前置参数,生成专用函数
比如一个通用的格式化函数 format(prefix, suffix, value),你想大量处理带「【ID】」前缀的字符串:
- 手动每次调用:
format('【ID】', '', '1001')、format('【ID】', '', '1002')……容易出错且冗余 - 柯里化后:
const idFormatter = format('【ID】', ''),之后只传value即可:idFormatter('1001')、idFormatter('1002') - 这个
idFormatter就是“缓存了 prefix 和 suffix”的新函数,本质是闭包绑定了那两个值
支持链式调用,灵活组合参数
当函数参数多于两个,柯里化能让你按需分步绑定:
- 原始函数:
request(method, url, data, headers) - 先固定 method 和 headers:
const postJson = request('POST')('', null, { 'Content-Type': 'application/json' }) - 再复用:
postJson('/api/users', { name: 'Alice' })、postJson('/api/orders', { item: 'book' }) - 每一步返回的新函数都“记住”了之前传的参数,不需要全局变量或配置对象
与 memoize 结合,对最终调用结果也缓存
柯里化解决的是“参数预设”,而 memoize 解决的是“结果复用”。两者可以叠加:
- 先柯里化:
const expensiveCalc = curry((a, b, c) => heavyCompute(a, b, c)) - 再装饰:
const cachedCalc = memoize(expensiveCalc(2)(5))→ 固定 a=2、b=5 后,只对不同 c 做结果缓存 - 这样既省去了重复传 a/b,又避免了相同 c 多次计算
- 注意:memoize 应作用在最终接收最后一个参数的函数上,否则缓存键会混乱
实际写法建议:用通用 curry 工具,别硬编码
手写单个柯里化函数易出错,推荐封装或使用成熟工具:
- 基础版 curry(支持动态参数长度):
function curry(fn) { return function curried(...args) { return args.length >= fn.length ? fn(...args) : (...rest) => curried(...args, ...rest); }; } - 调用:
const add3 = curry((a,b,c) => a+b+c)(1)(2),返回的函数已记住 a=1、b=2 - 生产环境建议用 Lodash 的
_.curry或 Ramda 的R.curry,它们处理了 this 绑定、rest 参数、边界情况等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











