柯里化函数

什么是柯里化函数?

  • 使用闭包,函数内部对传进去的数据进行存储,等到满足条件后,通过回调函数对存储的数据进行统一处理

柯里化函数的目的

  • 可以不间断的多次传入数据,函数不执行,等到满足一定条件后,统一执行

柯里化函数的展示

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);
posted on 2020-08-13 19:46  94Lucky  阅读(108)  评论(0编辑  收藏  举报