JS - compose 代码组合

compose 函数就是将几个有特点的函数拼凑在一起, 让它们结合, 产生一个崭新的函数。

作用:可以把一个函数的运行结果当作实参传给下一个函数,即实现层级嵌套的函数调用扁平化。

比如有这样的需求,要输入一个名字,这个名字由 firstNamelastName 组合而成,然后把这个名字全部变成大写输出来,比如输入 seaxiao,我们就要打印出来,‘HELLO, SEA XIAO’。我们考虑用函数组合的方法来解决这个问题,需要两个函数 greeting ,  toUpper

    var greeting = (firstName, lastName) => 'hello, ' + firstName + ' ' + lastName;
    var toUpper = str => str.toUpperCase();
    var fn = compose(toUpper, greeting);
    console.log(fn('sea', 'xiao'));

这个简单版的 compose 就可以解决

const compose = (fn2,fn1) => (firstName,lastName)=> fn2(fn1(firstName,lastName))

如果还想再加一个处理函数,不需要修改 fn,只需要在执行一个 compose ,比如我们再想加一个 toLower,只需要这样做

    var toLower = str => str.toLowerCase();
    var newFn = compose(trim, fn)
    console.log(newFn('sea', 'xiao'))

但是如果我们想一次性传入两个及以上的参数,这个简版的 compose 就不能满足要求,以下就是修改版的 compose:

    function compose(...funcs) {
      // 传递的函数集合
      return function (...args) {
        let length = funcs.length;
        if (length == 0) {
          //=>一个函数都不需要执行,直接返回ARGS
          return args;
        }
        if (length == 1) {
          //=>只需要执行一个函数,把函数执行,把其结果返回即可
          return funcs[0](...args)
        }
        return funcs.reduce((x,y)=> typeof x === "function" ? x(y(...args)) : y(...args))
      }
    }

reduce 递归在 compose 中相当重要

猜你喜欢

转载自www.cnblogs.com/-xiao/p/12501098.html