推荐答案
// www.javascriptcn.com code example
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...moreArgs) {
return curried.apply(this, args.concat(moreArgs));
};
}
};
}
// 示例用法
function add(a, b, c) {
return a + b + c;
}
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 输出: 6
console.log(curriedAdd(1, 2)(3)); // 输出: 6
console.log(curriedAdd(1)(2, 3)); // 输出: 6本题详细解读
什么是柯里化?
柯里化(Currying)是一种将多参数函数转换为一系列单参数函数的技术。通过柯里化,可以将一个接受多个参数的函数转换为一个接受单一参数的函数,并且返回接受余下参数的新函数,直到所有参数都被收集完毕,最终返回结果。
实现思路
- 参数收集:我们需要一个机制来收集传递给函数的参数,直到收集到的参数数量达到原函数的参数数量。
- 递归调用:如果收集到的参数数量不足,我们返回一个新的函数,继续收集剩余的参数。
- 执行原函数:当收集到的参数数量足够时,调用原函数并返回结果。
代码解析
curry(fn):这是柯里化的入口函数,接受一个函数fn作为参数。curried(...args):这是柯里化后的函数,接受任意数量的参数args。- 如果
args的长度大于或等于fn的参数数量(fn.length),则直接调用fn并返回结果。 - 否则,返回一个新的函数,继续收集剩余的参数,并将已收集的参数与新参数合并后递归调用
curried。
- 如果
示例解析
curriedAdd(1)(2)(3):首先收集1,然后收集2,最后收集3,当参数数量达到add函数的参数数量时,调用add(1, 2, 3)并返回结果6。curriedAdd(1, 2)(3):首先收集1和2,然后收集3,调用add(1, 2, 3)并返回结果6。curriedAdd(1)(2, 3):首先收集1,然后收集2和3,调用add(1, 2, 3)并返回结果6。
通过这种方式,柯里化函数可以灵活地处理不同数量的参数,并且可以逐步收集参数直到满足原函数的需求。