函数柯里化是将多参数函数转换为单参数函数链的技术,通过闭包固定前置参数生成专用函数,支持灵活传参方式(如f(a)(b)(c)或f(a,b)(c)),提升复用性与语义清晰度。

函数柯里化是解决重复传参最自然的方式之一——它不靠复制粘贴,而是通过“记住已传参数”来减少冗余调用。
核心逻辑:固定前置参数,生成专用函数
当多个调用共享部分参数(比如 API 的 base URL、日志级别、默认配置),柯里化能提前绑定这些值,后续只需传变化的部分。
- 例如:
const getUser = curry(fetchUser)('https://api.example.com')('Bearer token'),之后每次只需传id:getUser(123) - 再如:
const errorLog = curry(console.error)('【ERROR】'),后续直接errorLog('network timeout') - 关键不是“拆参数”,而是让复用的参数只写一次,且语义清晰
手写通用 curry 函数的关键细节
一个真正可用的 curry 必须支持多种传参方式(f(a)(b)(c)、f(a, b)(c)、f(a)(b, c)),而不仅是单参数链式调用。
- 依赖
fn.length判断期望参数总数,不是硬编码 - 用
args.concat(...rest)合并多批次参数,避免丢失 - 每次返回的新函数需保留原始上下文(
this),用fn.apply(this, mergedArgs) - 不建议在高频循环中无节制使用,闭包和递归有轻微开销
比柯里化更轻量的替代场景
并非所有重复传参都必须柯里化。简单固定可优先考虑更直接的方式:
- 用箭头函数封装:
const postJson = (url) => (data) => fetch(url, { method: 'POST', body: JSON.stringify(data) }) - 对象配置 + 工厂函数:
const createLogger = ({ level, prefix }) => (msg) => console.log(`${prefix}[${level}] ${msg}`) - 如果只是两次调用共用参数,直接提取变量比柯里化更易读
实际优化效果看这几点
柯里化是否真优化了重复传参,取决于三点:
- 参数复用频次高(>3 次)且结构稳定
- 调用分散在不同模块或时间点(比如初始化时绑 token,后续各处发请求)
- 团队能理解这种风格,不会因过度抽象反而增加维护成本
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











