柯里化是将多参数函数转换为每次只接受一个参数并返回新函数的过程,核心是分步传参、闭包保存已传参数,直至参数数量满足原函数要求时执行;常用于日志定制、api封装和工具函数特化。

柯里化(Currying)是把接受多个参数的函数,转换为每次只接受一个参数、并返回接收余下参数的新函数的过程。它最直接的价值就是参数复用:固定部分参数,生成可复用的特化函数。
核心思路:逐步收拢参数,返回新函数
柯里化不是一次性传入所有参数,而是“分步传参”。每传一个,就固定住它,返回一个等待下一个参数的函数。当参数数量满足原函数要求时,才真正执行。
例如,有函数 add(a, b, c),柯里化后可以写成 add(1)(2)(3),也可以复用前两个参数:const add12 = add(1)(2); add12(3) // 6,add12(10) // 13。
手写通用柯里化函数(支持任意参数个数)
关键在于:获取原函数期望的参数个数(fn.length),递归收集参数,直到数量足够再调用。
- 用闭包保存已传入的参数列表
- 每次调用返回一个新函数,接收下一个参数并追加到列表
- 当累计参数数 ≥ 原函数形参个数时,执行原函数
示例实现:
function curry(fn) {return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
}
};
}
实际中怎么复用参数?——常见场景
柯里化让“预设配置”变得自然简洁:
-
日志函数定制:把环境前缀固化,如
const logProd = curry(console.log)('[PROD]');,后续调用logProd('user login')自动带前缀 -
API 请求封装:固定 base URL 或 token,
const requestUser = curry(fetch)('/api/users');,再传 method 和 body 即可发起请求 -
工具函数特化:比如
const matchEmail = curry(String.prototype.match.bind(null, /[\w.-]+@[\w.-]+\.\w+/));,之后直接matchEmail('test@example.com')
注意点:与偏函数(Partial Application)的区别
柯里化严格按“一次一个参数”且返回函数链;而偏函数可一次传多个参数并返回新函数。例如 partial(add, 1, 2) 直接返回 (c) => add(1, 2, c)。两者都能实现参数复用,但柯里化更强调强制单参数调用风格,适合函数式组合(如配合 compose 或 pipe)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











