compose 和pipe

357 阅读2分钟

compose 和pipe

    如果要对一个数字进行下面代码的加减乘,算出最后结果,最普通的写法是需要嵌套执行函数或者定义多个变量作为函数的返回值,compose 则可以优化这个问题

      let sum = (x) => x + 10;
      let multiply = (y) => y * 10;
      let minus = (n) => n - 1;

compose 将嵌套的函数平铺,从右向左执行

      function compose() {
      //[].slice.call(arguments)可以将伪数据转换成数组,arguments 是具有长度属性的伪数组,
      //slice()如果不传入参数的话,则参数start=0,end=this.length,相当于返回一整个新数组,
      //新数组的修改不会改变原数组,相当于进行了一次深拷贝
        let args = [].slice.call(arguments);
        return function (num) {
          return args.reduceRight((res, cur) => {
            return cur(res);
          }, num);
        };
      }
      let calc = compose(sum, multiply, minus);
      console.log(calc(10)); //100

pipe 和compose 相反,从左向右执行

学会了compose之后pipe 就没有任何难度了,将compose中的ruduceRight 换成reduce 就可以了

      let pipe = function () {
        let arg = [].slice.call(arguments);
        return function (num) {
          return arg.reduce((a, b) => {
            return b(a);
          }, num);
        };
      };
      let pipeCalc = pipe(sum, multiply, minus);
      console.log(pipeCalc(10)) //199