• js函数柯里化(currying)的一些理解


    一.定义

       对传入函数的参数并不会立马进行求值,而是先将它们存储(利用闭包)起来,等到需要真正求值的时候一次性对之前传入的所有参数进行求值

    二.实列

    var add= (function () {
        var args = [];
        return function () {
          //通过函数的arguments属性判断该函数是否接受参数,如果没有参数,则计算args数组中的和
          if (arguments.length === 0) {
            var result = 0;
            for (var i = 0, l = args.length; i < l; i++) {
              result += args[i];
            }
            return result ;
            //如果有参数,则只能是将数据传到args数组中
          } else {
            [].push.apply(args, arguments);
          }
        }
      })();
      add(1) //不会求值,将其push到arguments中
      add(2)//不会求值,将其push到arguments中
      add()// 3  没有传入参数,进行求值
    三.通用的柯里化函数
    var currying = function (fn) {
        var args = [];
        return function () {
          if (arguments.length === 0) {
            return fn.apply(this, args);
          } else {
            [].push.apply(args, arguments);
            return arguments.callee; //指向当前调用函数的指针,此处指 
                                                     currying
          }
        }
      };

    四.应用

     var add= (function () {
        var result = 0;
        return function () {  //此处产生闭包,将值存储起来,不会销毁
          for (var i = 0, l = arguments.length; i < l; i++) {
            result += arguments[i];
          }
          return result ;
        }
      })();
    var myAdd = currying(add); // 调用通用的柯里化函数转化成 currying 函 
                                                  数
    myAdd (1) //不会求值
    myAdd (2) //不会求值
    myAdd()//3 求值
  • 相关阅读:
    UVA 10608 Friends
    UVA 10806 Dijkstra, Dijkstra.
    HDU 3715 Go Deeper
    poj1315
    poj1383
    poj1650
    poj1265
    poj1523
    RedHat9.0虚拟机安装
    注册DirectShow filter时应该注意中文路径
  • 原文地址:https://www.cnblogs.com/myspecialzone/p/11660357.html