zoukankan      html  css  js  c++  java
  • JS:函数柯里化

    函数柯里化

    1. 柯里化

      在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

      简单来说,就是固定一些参数,返回一个接受剩余参数的函数。

      其实就是使用闭包返回一个延迟执行函数。

      只看文字描述去理解柯里化可能有点难,举一个很经典的例子:

      // 这个例子是柯里化,也可以说是部分应用
      // 对于什么是部分应用,这里不进行探讨
      function add(num1, num2) {
          return num1 + num2;
      }
      
      function curry(func) {
          let args = [].slice.call(arguments, 1);
          
          return function() {
              let innerArgs = [].slice.call(arguments);
              let finalArgs = [...args, ...innerArgs];
              return func.apply(null, finalArgs);
          }
      }
      
      // 得到延迟执行函数
      let curriedAdd = curry(add, 5);
      // 可以多次复用得到的函数
      curriedAdd(1); // 6
      curriedAdd(2); // 7
      

      看了上面简单的例子,现在来实现能这样使用curriedAdd(1)(2, 3)(4)的柯里化函数:

      function aidCurry(func) {
          let args = [].slice.call(arguments, 1);
          return function() {
              return func.apply(null, [...args, ...arguments]);
          }
      }
      
      function curry(func, length) {
          length = length || func.length;
          
          return function() {
              // 传入参数为 0,表示返回结果
              if (arguments.length != 0 && arguments.length < length) {
                  let finalArgs = [func, ...arguments];
                  // 参数的数量不足时,利用闭包将已传入参数存储起来
                  return curry(aidCurry.apply(null, finalArgs), length - arguments.length);
              } else {
                  // 参数数量够了或者中途结束,则返回结果
                  return func.apply(null, arguments);
              }
          };
      }
      
      // length 为 4,表示当传入参数到达4个时返回结果
      let curriedAdd = curry(function add() {
          return [...arguments].reduce((acc, cur) => acc + cur);
      }, 4);
      
      // 传入参数为4个
      curriedAdd(1)(2, 3)(4); // 10
      // 中途结束
      curriedAdd(1)(2, 3)(); // 6
      // error: not a function
      curriedAdd(1)(2)()(3); // 使用 (),就表示返回结果,已经不是函数
      curriedAdd(1)(2, 3)(4)(); // 传入参数已经为4个,所以返回结果了,已经不是函数
      
  • 相关阅读:
    arcgis建立拓扑分析(检验矢量图)
    矢量图面层和线层相交得到相交后的线层文件(gis相交)
    关于处理注册表权限无法修改的问题(无法打开主键或注册表项unknown)
    my.cnf配置文件
    keepalived联动mysql
    安装客户端连接软件(zabbix_agentd-filebeat-flume)
    zabbix短信配置说明
    zabbix监控工具添加网络设备Ping
    新买了硬盘,让Linux系统识别硬盘nfs---->改成xfs
    vnc软件使用
  • 原文地址:https://www.cnblogs.com/guolao/p/10144086.html
Copyright © 2011-2022 走看看