js函数柯里化
发布于 8 年前 作者 Thstone37 3408 次浏览 来自 分享

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

###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
回到顶部