Javascript 函数柯里化

39 阅读2分钟

函数柯里化实现代码

// 步骤 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