返回

lodash里的createRecurry是啥?从js的递归聊起~

前端

了解 Lodash 中的 createRecurry 方法:递归与柯里化函数

在 JavaScript 的世界中,递归和柯里化函数经常携手并进,创造出简洁、可读且可维护的代码。而 Lodash 中的 createRecurry 方法更是将这两种强大技术巧妙地融合在一起。

递归:自我调用的艺术

想象一下这样的场景:一个函数不断调用自己,直到满足特定的条件为止。这就是递归,它在处理需要重复任务的复杂数据结构时大显身手。在 JavaScript 中,递归通常以这样的形式出现:

function factorial(n) {
  if (n === 0) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}

在这个例子中,factorial 函数不断调用自身,将 n 递减,直到达到基线条件 n === 0。这使得我们可以轻松计算 n 的阶乘。

柯里化:拆分参数的魔法

柯里化是一种将多参数函数分解为一系列单参数函数的技术。它有助于减少参数的认知负荷,提高代码的灵活性。Lodash 中的 createRecurry 方法就是为柯里化而生的。

const add = (a, b, c) => a + b + c;

const add3 = createRecurry(add, 3);

add3(1)(2)(3); // 6

在此示例中,add3 函数将原本需要三个参数的 add 函数转换为一个可以分步调用的函数。这使我们可以更灵活地传递参数,从而提高代码的可读性。

createRecurry:幕后的英雄

那么,createRecurry 方法是如何工作的呢?它接受两个参数:一个要柯里化的函数和一个指定所需参数个数的位掩码。

function createRecurry(func, bitmask) {
  let result;

  return function(...args) {
    if (args.length < bitmask) {
      result = result ? result.concat(args) : args;

      return result.length >= bitmask
        ? func.apply(this, result)
        : createRecurry(func, bitmask - args.length).apply(this, args);
    }

    return func.apply(this, args);
  };
}

该方法首先检查传入的参数个数是否小于位掩码。如果不是,它将参数存储在一个 result 数组中,并返回一个新的柯里化函数。否则,它将参数传递给目标函数并返回结果。

这个递归过程将继续进行,直到传入的参数个数等于或大于位掩码。

案例:分步求和

让我们用一个实际例子来理解 createRecurry 的作用:

const sum = (...args) => args.reduce((total, num) => total + num, 0);

const sum3 = createRecurry(sum, 3);

sum3(1, 2, 3); // 6
sum3(1, 2)(3); // 6

在 sum3 函数中,我们柯里化了 sum 函数,使其可以分步接收参数。我们可以逐个传递数字,或者将它们作为数组传递,最终的结果是一样的。

常见问题解答

  • 为什么要使用递归? 递归有助于处理需要重复性处理的复杂数据结构或问题。
  • 柯里化函数的优势是什么? 柯里化函数减少了参数的认知负荷,提高了代码的灵活性。
  • createRecurry 方法如何工作? createRecurry 方法接受两个参数:要柯里化的函数和一个指定所需参数个数的位掩码。
  • 为什么 createRecurry 方法对于柯里化至关重要? createRecurry 方法为柯里化函数的递归调用提供了底层支持。
  • 在哪些情况下使用 createRecurry 方法比较合适? 当需要柯里化多参数函数时,使用 createRecurry 方法是一个不错的选择。

总结

Lodash 中的 createRecurry 方法是递归和柯里化函数的强大组合,为 JavaScript 开发人员提供了一种有效地处理复杂任务的方法。通过理解其工作原理,我们可以在代码中巧妙地运用 createRecurry,从而提升可读性、可维护性和灵活性。