JS高级编程技巧4(compose组合函数)

在函数式编程当中有一个很重要的概念就是函数组合, 实际上就是把处理数据的函数像管道一样连接起来, 然后让数据穿过管道得到最终的结果。 例如:

	const add1 = (x) => x + 1;
    const mul3 = (x) => x * 3;
    const div2 = (x) => x / 2;
    div2(mul3(add1(0))); //=>3

而这样的写法可读性明显太差了,我们可以构建一个compose函数,它接受任意多个函数作为参数(这些函数都只接受一个参数),然后compose返回的也是一个函数,达到以下的效果:

	const operate = compose(div2, mul3, add1)
    operate(0) //=>相当于div2(mul3(add1(0))) 
    operate(2) //=>相当于div2(mul3(add1(2)))

简而言之:compose可以把类似于f(g(h(x)))这种写法简化成compose(f, g, h)(x),请你完成 compose函数的编写

练习题:

将第一个函数得到的返回值当作实参传递给第二个函数,依次这样传递下去。

const add1 = x => x + 1;
const mul3 = x => x * 3;
const div2 = x => x / 2;
var result = div2(mul3(add1(0)));
console.log(result); //->1.5 
习题解析:

funcs:存储的是最后需要执行的函数及其顺序(最后传递的函数优先执行)

  • 执行compose只是把最后要执行的函数及顺序事先存储起来,函数还没有执行「柯理化思想」
  • 返回一个operate处理函数,执行operate,并且传递初始值,才按照之前存储的函数及顺序依次执行函数
const add1 = x => x + 1;
const mul3 = x => x * 3;
const div2 = x => x / 2;

function compose(...funcs) {
    return function operate(x) {
      //一个函数都不传,直接返回初始值
        if (funcs.length === 0) return x;
      //只传递一个参数,判断是否是函数,是函数直接执行,不是函数直接返回初始值
        if (funcs.length === 1) return typeof funcs[0] === "function" ? funcs[0](x) : x;
        //后传递的函数先执行,reduceRight()从右开始先循环遍历
        return funcs.reduceRight(function (result, item) {
          //item不是函数直接跳过,返回值
            if (typeof item !== "function") return result;
            //item是函数就直接将上一次的返回结果当作实参传递给当前这个item函数
            return item(result);
        }, x);
    };
}
var operate = compose(div2, mul3, add1);
var result = operate(0);
console.log(result);//1.5

思考题:node_modules中的compose.js函数,研究这个是如何实现的

function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg
  }

  if (funcs.length === 1) {
    return funcs[0]
  }

  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}

初步分析如下:

function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg
  }

  if (funcs.length === 1) {
    return funcs[0]
  }
  return funcs.reduce(function(a,b){
    return function(...args){
      return a(b(...args));
    }
  });
  //return funcs.reduce((a, b) => (...args) => a(b(...args)))
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Composition 是一种软件设计模式,是指将一些简单的对象组合起来,使它们能够协同工作,从而实现更复杂的功能。 在 JavaScript 中,我们可以使用函数来实现对象之间的组合。例如,我们可以定义一个函数来调用另一个函数,并将其返回值作为参数传递给第三个函数。这样,我们就可以将多个函数组合起来,从而实现更复杂的功能。 例如,我们可以使用以下代码来实现函数组合: ``` function add(x, y) { return x + y; } function multiply(x, y) { return x * y; } function compose(f, g) { return function(x) { return f(g(x)); }; } const addThenMultiply = compose(multiply, add); console.log(addThenMultiply(2, 3)); // Output: 5 ``` 在这个例子中,我们定义了两个简单的函数 `add` 和 `multiply`,然后定义了一个函数 `compose`,它接受两个函数作为参数,并返回一个新的函数,该函数调用参数函数 `f` 和 `g`,并将 `g` 的返回值作为参数传递给 `f`。 然后,我们使用 `compose` 函数将 `multiply` 和 `add` 组合起来,并将结果赋值给变量 `addThenMultiply`。最后,我们调用 `addThenMultiply` 并传入两个参数,输出结 ### 回答2: js中的compose是一个函数组合工具,可以将多个函数组合成一个新的函数。通过compose可以更方便地实现函数的复用和组合。 通过compose,我们可以将多个函数按照从右到左的顺序组合起来,形成一个新的函数。这个新函数将会依次执行传入的函数,并将前一个函数的返回值作为参数传递给下一个函数。最终,compose函数返回的是一个函数,可以将任意参数传入这个函数进行计算。 使用compose的好处之一是可以减少深层嵌套的函数调用。通过组合多个函数,我们可以将原本需要多个函数嵌套调用的操作简化为调用一个compose函数,提高代码的可读性和可维护性。 另外,compose还能够方便地进行函数的复用。通过将一些通用的函数组合在一起,可以在不同的场景下反复使用,避免重复编写相似的代码。这对于代码的重用性和可维护性来说是非常重要的。 compose函数编程中起到了很重要的作用,它帮助我们更好地管理和组织函数,提高了代码的可复用性和可扩展性。在实际的开发中,我们可以利用compose来简化代码,提高开发效率。 ### 回答3: JavaScript中的compose是一个函数编程概念,用于将多个函数合并为一个函数。这个合并后的函数可以将输入值依次传递给每个函数,然后输出最终结果。 在JavaScript中,我们可以使用函数组合来提高代码的可读性和可维护性。通过将多个小型、独立的函数组合成一个更大的函数,我们可以将复杂的问题分解成更简单的部分。 compose函数接受多个函数作为参数,并返回一个新的函数。这个新的函数将从右到左依次调用输入值,并将每个函数的输出作为下一个函数的输入。最终,compose函数将返回最后一个函数的输出作为整个组合函数的最终结果。 具体来说,如果我们有三个函数A、B和C,我们可以使用compose函数将它们组合成一个新的函数。这样,当输入值传递给这个组合函数时,它会依次调用函数C、B和A,并将最终结果返回。 例如,我们有三个函数double、addOne和square分别将一个数字加倍、加一和平方。我们可以使用compose函数将它们组合成一个新的函数: const double = x => x * 2; const addOne = x => x + 1; const square = x => x * x; const composedFunction = compose(square, addOne, double); 当我们调用`composedFunction(3)`时,它将首先使用double函数将3加倍,然后使用addOne函数将结果加一,最后使用square函数将结果平方。最终,它将返回81作为输出结果。 通过使用compose函数,我们可以将大型的、复杂的功能分解成更小、更简单的部分,并且将这些部分组合起来以生成更具可读性和可维护性的代码。这是一种非常有用的编程技术,在JavaScript中经常被用于函数编程函数组件开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值