js高阶函数:柯里化===>还是不太会

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值