zoukankan      html  css  js  c++  java
  • 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 求值
  • 相关阅读:
    博客园小技巧【转载】
    Windows下的多线程
    【Windows】Windows中的数据类型以及命名
    【文档管理系统】【转】什么是元数据
    CentOS 安装 MariaDB 全部命令
    emacs 入门
    参考路径
    My SQL load data infile 遇到的问题总结
    oracle迁移到mysql(仅使用脚本)
    Eclipse tomcat server 无法添加项目
  • 原文地址:https://www.cnblogs.com/myspecialzone/p/11660357.html
Copyright © 2011-2022 走看看