zoukankan      html  css  js  c++  java
  • JS

    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 中相当重要

  • 相关阅读:
    ftp-server(对象存储)
    zabbix监控VMware6.7
    linux安装中文字体
    vsftpd不支持目录软链接的解决办法
    linux内网IP如果判断出网IP地址
    mysql ANSI_QUOTES 这个sql_mode的作用(字段可以使用双引号)
    查看tomcat项目中,具体占用cpu高的线程。
    nginx ssl 自签证书实验
    Redis复制和哨兵部署
    利用Python脚本备份服务器上所有PostgreSQL数据库
  • 原文地址:https://www.cnblogs.com/-xiao/p/12501098.html
Copyright © 2011-2022 走看看