(七)函数组合

44 阅读3分钟

1.什么是函数组合?

add(squre(double(2)))函数组合指的是将多个函数组合成一个新的函数,将一个函数的输出作为另一个函数的输入。将多个简单的函数组合成一个更为复杂的函数。

2.为什么有函数组合?

函数组合作用:使得函数职责单一,如果有bug更好的定位。

以下内容引入"是洋柿子啊"大佬中的《 【前端进阶】 由浅入深学会函数组合,进阶必备技能!2.0更新版!》
附链接:juejin.cn/post/701742…

在我们深入了解函数组合的时候,我们先看看以下的内容:

什么是管道

下面这张图表示程序中使用函数处理数据,a参数输入给函数fn,在fn中经过各种逻辑处理从而得出结果b,这就是数据a通过管道fn之后变成了bimage.png

管道拆分

上图中的管道看起来很方便,因为我们只需要维护这个管道就好

Q: 管道的长度、广度过大的时候,如果这个管道出现了一些纰漏,那我们排查起来的工作量就很大,很困难,该如何处理呢?

A: 拆分管道!

下面这张图我们将管道fn拆分成了f3f2f1,再通过参数a的输入之后,经过f3管道的处理获得mm在通过f2,如此进行,最终获得结果b

经过这样的拆分,我们可以保证每个函数的颗粒度,在之后出现问题的时候,我们可以更快更精准的进行问题打击,一击致命!bug来的快,去的更快! (ps:中间产生的中间结果我们是不需要进行考虑的) image.png 我们使用伪代码描述一下这张图

fn = compose(f1,f2,f3)
b = fn(a)

3.实现自动函数组合

function createCompse(isRight = true) {

  return function compose(...fns) {

    let len = fns.length;

    // 类型检查

    for (let i = 0; i < len; i++) {
      if (typeof fns[i] !== "function") {
        throw new TypeError("Expected arguments are functions");
      }
    }

    // 函数是否从右向左运行

    fns = isRight ? fns.reverse() : fns;

    return function (...args) {
      let index = 0;
      let result = fns[index].apply(this, args);
      while (++index < len) {
        result = fns[index].call(this, result);
      }
      return result;
    };

  };
}

使用案例如下:

function addTwo(m) {
  return m + 2;
}

function double(m) {
  return m * 2;
}

function square(m) {
  return m * m;
}

  


const composeRight = createCompse(false);
const composeLeft = createCompse();

const newFnOne = composeRight(addTwo, double, square); //执行顺序 square-> double -> addTwo
console.log(newFnOne(1)); //6

const newFnTwo = composeLeft(addTwo, double, square); //执行顺序 addTwo-> double -> square
console.log(newFnTwo(1)); //4

4.柯里化函数和函数组合的区别

函数柯里化是将多参数的函数转化为一系列接受单一参数的函数,目的是为了实现参数复用和创建可复用的函数
函数组合是将多个函数组合成一个新的函数,目的是为了实现函数的 模块化可组合性
它们分别关注于函数的参数处理和函数的组合关系。