概念是自己的话总结的。functioncurrying的意思是你可以一次给curry函数传递很多参数,也可以多次传递。curry函数将返回一个函数来处理剩余的参数,直到返回最终结果。例子这里有几个例子来说明:curriedsumfunction//normalwayvaradd1=function(a,b,c){returna+b+c;}//curriedvaradd2=function(a){returnfunction(b){returnfunction(c){returna+b+c;这里,每传入一个参数,就会返回一个新的函数,一直执行到最后一次返回a+b+c的值。但是这个实现还是有问题的。这里只有三个参数。如果有一天产品经理告诉我们需要改100次?我们只是重写100次?这显然不符合开闭原则,所以我们需要修改一次函数。varadd=function(){var_args=[];returnfunction(){if(arguments.length===0){return_args.reduce(function(a,b){returna+b;})}[].push.apply(_args,arguments);返回arguments.callee;}}varsum=add();sum(100,200)(300);sum(400);sum();//1000wepass判断下次是否传入参数决定函数是否运行。如果参数继续传入,那么我们继续保存参数,运行的时候一次性全部运行。这样,我们就初步完成了一个柯里化的函数。一般的柯里化函数在这里只是求和的函数,如果换成乘法呢?我们需要重新写一遍吗?仔细看看我们的add函数。如果我们把if里面的代码换成一个执行代码的函数,是不是就可以变成通用函数了呢?varcurry=function(fn){var_args=[];returnfunction(){if(arguments.length===0){returnfn.申请(fn,_args);}[].推。应用(_args,参数);返回arguments.callee;}}varmulti=function(){return[].reduce.call(arguments,function(a,b){returna+b;})}varadd=curry(multi);添加(100、200、300)(400);添加(1000);添加();//2000在前面的方法中,我们对其进行了扩展,这样我们就实现了一个更通用的柯里化函数。也许你想问,如果我不想每次都使用那个丑陋的右括号怎么办?varcurry=function(fn){varlen=fn。长度,args=[];返回函数(){数组。原型。推。应用(参数,参数)varargsLen=args。长度;如果(argsLen
