美文网首页
js中函数柯里化(currying)

js中函数柯里化(currying)

作者: Thstone | 来源:发表于2016-08-16 15:08 被阅读0次

    函数柯里化就是创建已经设置单个参数或者多个参数的函数,函数变为接受一个参数,返回一个值,

    1,实现

    默认下为参数复用的情况

    function curry(fn){
            var curry=function(fn){
                  //这里是需要复用的参数
                  var args=Array.prototype.slice.call(arguments,1);
                  return function(){
                    //这里是自身参数
                      var innerArgs=Array.prototype.slice.call(arguments);
                       //合并自身参数和复用的参数
                    var finalArgs=args.concat(innerArgs);
                    return fn.apply(null,finalArgs);
                }
            }
    }
    

    2,应用

    1,参数复用

        var curry=function(fn){
            //这里是需要复用的参数
            var args=Array.prototype.slice.call(arguments,1);
            return function(){
                   //这里是自身参数
                   var innerArgs=Array.prototype.slice.call(arguments);
                   //合并自身参数和复用的参数
                var finalArgs=args.concat(innerArgs);
                return fn.apply(null,finalArgs);
            }
        }
        var add=function(){
               var args=Array.prototype.slice.call(arguments);
               var sum=0;
               for(var i=0;i<args.length;i++){
                  sum+=args[i];
               }
               return sum;
        }
        var curryAdd=curry(add,3,4,5);
        console.log(curryAdd(6,7))   //结果为25,也可以传入单个参数
    

    2,延迟计算

    创建已经设置单个参数或多个参数的函数的情况下,即在参数复用的情况,同时实现延迟计算

            var add=function(){
                   var args=Array.prototype.slice.call(arguments);
                   var sum=0;
                   for(var i=0;i<args.length;i++){
                      sum+=args[i];
                   }
                   return sum;
            }
            var curryDelay=function(fn){
                //复用的参数
                var args=Array.prototype.slice.call(arguments,1);
                //定义一个保存复用参数和自身参数的数组
                var ary=args;
                return function(){
                    //这里是自身参数              
                    if(arguments.length==0){                    
                        return fn.apply(null,ary);
                       }else{                      
                            ary=ary.concat(Array.prototype.slice.call(arguments));
                            console.log(ary);
                    }
                }
            }
             var curryDelayAdd=curryDelay(add,3,4,5);
             curryDelayAdd(6);                  //ary为[3,4,5,6]
             curryDelayAdd(7);                  //ary为[3,4,5,6,7]
             curryDelayAdd(8);                  //ary为[3,4,5,6,7,8]
             console.log(curryDelayAdd());      //结果33
    

    相关文章

      网友评论

          本文标题:js中函数柯里化(currying)

          本文链接:https://www.haomeiwen.com/subject/jtypsttx.html