函数柯里化实现代码
// 步骤 1: 定义柯里化函数 curry,接受一个函数 fn 作为参数
function curry(fn) {
// 步骤 2: 返回一个新的函数 curried,这个函数可以接受任意数量的参数
return function curried(...args) {
// 步骤 3: 检查当前传入参数的数量是否大于或等于原始函数 fn 的参数数量
if (args.length >= fn.length) {
// 如果是,调用原始函数 fn,并将当前参数传递给它,然后返回结果
return fn(...args);
} else {
// 步骤 4: 如果参数数量不足,返回一个新的函数,该函数会继续接受更多的参数
return function (...moreArgs) {
// 步骤 5: 将当前参数 args 与新参数 moreArgs 连接起来,然后递归调用 curried 函数
return curried(...args.concat(moreArgs));
};
}
};
}
解释
这个 curry 函数接受一个参数 fn,这是我们要柯里化的原始函数。
内部定义了一个名为 curried 的函数,它接受任意数量的参数(使用 ...args 来收集参数)。
在 curried 函数内部,我们首先检查传递的参数数量是否大于或等于原始函数 fn 的参数数量(使用 fn.length)。如果是,就调用原始函数 fn,并将参数传递给它。
如果传递的参数数量不足以调用原始函数,我们返回一个新的匿名函数,该函数会继续接受更多的参数(使用 ...moreArgs 来收集额外参数),并将它们与之前的参数连接起来。
这个过程将一直持续下去,直到传递的参数数量足够多以满足原始函数的要求。然后,原始函数将被调用,并返回结果。
使用
这就是柯里化函数的实现方式。现在,你可以使用它来柯里化任何函数,例如:
function add(a, b, c) {
return a + b + c;
}
const curriedAdd = curry(add);
const addTwo = curriedAdd(2);
const addFive = addTwo(3);
console.log(addFive(4)); // 输出 9
// 逐步调用
console.log(curriedAdd(1)(2)(3)); // 输出 6
console.log(curriedAdd(1, 2)(3)); // 输出 6
console.log(curriedAdd(1)(2, 3)); // 输出 6