curry js实现
curry js实现
柯里化(Currying)是一种将多参数函数转换为一系列单参数函数的技术。在JavaScript中,可以通过闭包和高阶函数实现柯里化。
基本柯里化实现
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
}
}
};
}
// 示例用法
function sum(a, b, c) {
return a + b + c;
}
const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3)); // 6
无限参数柯里化
对于参数数量不固定的函数,可以实现无限柯里化:
function infiniteCurry(fn) {
return function curried(...args) {
return function(...args2) {
if (args2.length === 0) {
return args.reduce((acc, val) => fn(acc, val));
}
return curried(...args.concat(args2));
}
};
}
// 示例用法
const add = infiniteCurry((a, b) => a + b);
console.log(add(1)(2)(3)(4)()); // 10
反向柯里化
反向柯里化(Uncurrying)是将柯里化函数转换回普通函数的过程:
Function.prototype.uncurry = function() {
return (...args) => {
let fn = this;
for (const arg of args) {
fn = fn(arg);
}
return fn;
};
};
// 示例用法
const uncurriedSum = curriedSum.uncurry();
console.log(uncurriedSum(1, 2, 3)); // 6
实际应用场景
柯里化在函数组合和部分应用中非常有用:

// 部分应用
const add5 = curriedSum(5);
console.log(add5(10)(15)); // 30
// 函数组合
const compose = (...fns) => x => fns.reduceRight((v, f) => f(v), x);
const double = x => x * 2;
const square = x => x * x;
const doubleThenSquare = compose(square, double);
console.log(doubleThenSquare(5)); // 100
性能考虑
柯里化会创建多个闭包,可能影响性能。在生产环境中,应权衡使用,或在性能关键路径避免过度柯里化。






