likes
comments
collection
share

js-函数组合

作者站长头像
站长
· 阅读数 39

前言

函数组合使用到的概念包括:

  1. 函数式编程:函数式编程是一种编程范式,它强调函数的纯粹性和可组合性。函数式编程可以使代码更加模块化、可重用、易于维护,同时也可以提高代码的性能和可读性。
  2. 柯里化:柯里化是一种将多个参数的函数转换为一系列单参数函数的技术。柯里化可以使函数更加模块化、可重用、易于组合。在函数组合中,柯里化可以使我们更容易地将多个函数组合成一个更复杂的函数。
  3. 高阶函数:高阶函数是指接收一个或多个函数作为参数,并/或返回一个函数的函数。高阶函数可以使我们更容易地将多个函数组合在一起,创造出更复杂的函数。

介绍

顾名思义,函数组合就是将多个函数组合成一个函数,让它们依次执行,将一个函数的输出作为另一个函数的输入。它的原理其实很简单。我们可以把每个函数都看成一个黑盒子,它们接收一个输入,然后输出一个结果。将它们组合在一起,就像是把多个黑盒子串联在一起,让它们顺序执行,最终输出一个最终结果。

主要是为了让我们的代码更加模块化、可重用、易于维护。我们可以将多个小函数组合成一个更复杂的函数,让代码具备更高的可读性和可维护性

在 JavaScript 中,函数组合通常使用 compose函数pipe函数 来实现。这些函数都是高阶函数,它们接收多个函数作为参数,并返回一个新的函数。

compose函数

介绍

compose函数 将多个函数组合成一个函数,并将它们从右到左依次执行。

例如,如果我们有三个函数f、g和h,那么可以使用 compose函数 将它们组合成一个新的函数fgh,如下所示:

const f = x => x + 1;
const g = x => x * 2;
const h = x => x - 3;

const fgh = compose(f, g, h);
console.log(fgh(10)); // 15

在上面的例子中,compose(f, g, h) 将函数h、g和f组合成一个新的函数 fgh ,它接收一个数字,按照 f(g(h(x))) 的顺序执行。

实现

function compose(...funcs) {
  return function (arg) {
    return funcs.reduceRight((acc, curr) => curr(acc), arg);
  };
}

//使用es6语法
const compose = (...funcs) => arg => funcs.reduceRight((acc, curr) => curr(acc), arg);

这段代码中的 compose函数 接受一个或多个函数作为参数,并返回一个新函数。这个新函数接受一个参数 arg,并将它传递给一个 reduceRight 方法中。reduceRight 方法遍历函数数组并将它们从右往左组合起来,最终返回一个组合函数。

是不是特别好奇为什么是从右往左,别急,pipe函数来了

pipe函数

介绍

pipe函数 将多个函数组合成一个函数,并将它们从左到右依次执行

pipe函数和compose函数唯一的区别就是传参顺序和执行顺序不一致,compose函数的传参顺序和执行顺序是从右往左,而pipe函数是从左往右

实现

function pipe(...funcs) {
  return function (arg) {
    return funcs.reduce((acc, curr) => curr(acc), arg);
  };
}

//使用es6语法
const compose = (...funcs) => arg => funcs.reduce((acc, curr) => curr(acc), arg);

这上面的实现和 compose函数 原理一致,就不再赘述了,仅仅只是 reduceRight 方法变成了reduce 方法

测试

根据上面的实现,我们来测试一下

const f = x => x + 1;
const g = x => x * 2;
const h = x => x - 3;

const composeResult = compose(f, g, h)(10);
console.log(composeResult); // 15

const pipeResult = pipe(h, g, f)(10);
console.log(pipeResult); // 19

pipe函数compose函数 虽说原理一致,但一般来说 compose函数 用的会更多一些

就拿上面的例子来说,我们可以使用函数组合将它们组合成一个新函数:

const composedFunction = x => h(g(f(x)));

在这个例子中,我们首先将输入值 x 传递给函数 f,然后将 f(x) 的结果传递给函数 g,最后将 g(f(x)) 的结果传递给函数 h。这个过程将三个函数组合成了一个新函数,它按照正确的顺序执行所有组合函数。

从右往左组合函数更符合这种函数组合的本质,因为它遵循了函数的组合性质。具体来说,如果将函数 f 和 g 组合在一起,我们期望得到一个新函数 h,使得 h(x) = f(g(x))。如果我们将 f 和 g 的顺序反过来组合,也就是 h(x) = g(f(x)),那么这个新函数的行为就与我们期望的不同了。

因此,从右往左组合函数更符合函数组合的本质,因为它确保了组合函数的顺序与函数的组合性质相一致。这样做可以使代码更加清晰、易于理解和维护。

结束

在这篇文章中,我们一起探讨了函数组合的定义、原理、实现以及验证,我们对于函数组合应该有了更深的了解

最后,祝大家变得更强!

转载自:https://juejin.cn/post/7251862944022560826
评论
请登录