柯里化是将多参数函数转为单参数函数链的技术,通过闭包保存已传参数实现分步调用;如add(1)(2)(3)等价于add(1,2,3),支持暂停、复用与组合;通用实现依赖fn.length判断参数是否齐备,不足则递归返回新函数。

柯里化是一种将接收多个参数的函数,转换为一系列只接收一个参数的函数的技术。它的核心思想是“参数分步传入”,每次调用只传一个参数,返回一个等待下一个参数的新函数,直到所有参数都传完,才执行原函数并返回最终结果。
柯里化的关键特征
它不是简单地把参数拆开,而是通过闭包保存已传入的参数,形成链式调用。比如 add(1)(2)(3) 等价于 add(1, 2, 3),但前者支持中途暂停、复用和组合。
手动实现一个通用柯里化函数
可以基于函数的 length 属性(形参个数)来判断是否收集齐参数:
- 定义一个递归函数,接收原函数
fn - 内部返回一个接收单个参数的函数
- 每次调用时把参数存入数组,若参数数量够了就用
fn.apply()执行;不够就返回新的柯里化函数
示例代码:
采用HttpClient向服务器端action请求数据,当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。 实现Android与服务器端数据交互,我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,
立即学习“Java免费学习笔记(深入)”;
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 logError = curry(console.log)('[ERROR]');,之后调用logError('network failed') - 构建可复用的验证器:
const isGreaterThan = curry((min, val) => val > min); const isPositive = isGreaterThan(0); - 配合
map或filter使用时更简洁,避免写箭头函数包装
注意边界与限制
柯里化依赖函数声明时的形参个数,对不定参数(...args)、箭头函数或动态参数处理较弱;ES6+ 中部分内置方法(如 Array.prototype.map)不支持直接柯里化调用,需封装。另外,过度柯里化可能影响可读性,应权衡简洁性与意图表达。









