柯里化函数
什么是柯里化函数?
- 使用闭包,函数内部对传进去的数据进行存储,等到满足条件后,通过回调函数对存储的数据进行统一处理
柯里化函数的目的
- 可以不间断的多次传入数据,函数不执行,等到满足一定条件后,统一执行
柯里化函数的展示
function curry(fn){
var arr=[]; //私有变量
return function(){
if(arguments.length>0){
arr=arr.concat(Array.from(arguments)); //数据的存储
return arguments.callee; //返回函数自身 实现连缀写法的效果
}else{
return fn.apply(null,arr); //通过apply来传参,回调函数中Array.from() 才能对数据进行操作,直接传参,回调函数中Array.from()后变成二维数组
}
}
}
function fns(){
return Array.from(arguments).reduce((value,item)=>value+=item);
}
var sum=curry(fns); //闭包 返回的函数赋值给全局变量
var s=sum(1)(2,3)(4,5,6)()
console.log(s);
柯里化的原型写法
Function.prototype.currying=function(){
var arr=[];
var self=this; //this指向的是调用这个方法的函数(相当于是实例化对象)
return function(){
if(arguments.length>0){
arr=arr.concat(Array.from(arguments));
return arguments.callee;
}
return self.apply(null,arr);
}
}
function getSum(){
return Array.from(arguments).reduce((value,item)=>value+=item);
}
var f=getSum.currying();
f(1);
f(2,3,4);
console.log(f());
反柯里化
Function.prototype.unCurrying=function(){
var self=this; //这里的this指向的是调用这个方法的数组方法push
return function(){ //这是下面push的函数
return (Function.prototype.call).apply(self,arguments); //Function.prototype.call(Array.prototype.push,[1,2,3,4],-2)
}
}
var push=Array.prototype.push.unCurrying();
function getSum(){
push(arguments,-2); //这里的arguments是 1,2,3,4 这里的push是个函数 参数的组合
}
getSum(1,2,3,4);