函数柯里化什么是函数柯里化?一种函数采用单个参数(原始函数的第一个参数)并返回接受其余参数并返回结果的新函数的技术。柯里化快速入门接下来我们通过一个例子来体验一下柯里化。有一个函数可以计算两个数的和:functionadd(a,b){returna+b;}将add函数柯里化为:functionaddCurrying(a){returnfunction(b){returna+b;}}可以看出函数addCurrying接受了原函数的第一个参数,返回一个接受其余参数的函数,利用闭包的特性来存储a的值。所以通过上面的代码示例,我们可以了解到柯里化函数的特点:1.柯里化函数首先会接受参数。接受这些参数后,函数不会立即求值,而是返回调用另一个函数,刚刚接受的参数会保存在函数形成的闭包中。2.当函数需要真正求值时,即接收到原函数需要的所有参数时,会将闭包中存储的数据一起求值。函数柯里化的实际应用通过上面的例子,我们体验到了什么是柯里化函数。但是问题来了,花那么多心思封装一层有什么用呢?没有任何好处。我们程序员不可能做更多的事情。这辈子是不可能的。那么接下来我们就来看看Curry这个函数吧。变换的两个实际应用。参数复用就是固定相同的参数//正常的正则验证字符串reg.test(txt)//函数封装后functioncheck(reg,txt){returnreg.test(txt);}//即使是同样的正则表达式也需要再传一遍console.log(check(/\d+/,'test1'))//trueconsole.log(check(/\d+/,'testt'))//false//KeAftercurryingfunctioncheckCurrying(reg){returnfunction(txt){returnreg.test(txt);}}}varhasNumber=checkCurring(/\d+/);console.log(hasNumber('test1'));console.log(hasNumber('testt'));可以看出,柯里化校验函数后,可以固定同一个正则表达式的参数,得到一个只需要接收待检测字符串的函数。达到了参数重用的目的。提前确认varon=function(element,event,handler){if(document.addEventListener){if(element&&event&&handler){element.addEventListener(event,handler,false);}}else{if(element&&event&&handler){element.attachEvent('on'+event,handler)}}}on(div,'click',function(){})varonCurrying=(function(){if(document.addEventListener){returnfunction(element,event,handler){if(element&&event&&handler){element.addEventListener(event,handler,false);}}}else{返回函数(element,event,handler){if(element&&event&&handler){element.attachEvent('on'+event,handler);}}}})()on(div,'click',function(){})在工作的过程中在项目上,封装DOM的操作可以说是很正常的,不过上面第一种写法比较常见,但是我们来看第二种写法。与第一种写法相比,它是自执行然后返回一个新的函数,这样就提前确定了使用哪种方法。避免每次都判断。封装通用柯里化函数接下来,让我们封装一个通用柯里化函数。函数currying(){varfn=arguments[0];varargs=[].slice.call(arguments,1);如果(fn.length===args.length){返回fn.应用(这个,参数);}else{function_currying(){args.push(...参数);如果(fn.length===args.length){返回fn.应用(这个,参数);}else{返回_currying;}}返回_currying;}}构造函数(Arg1,Arg2,...,Argn)构造函数(Arg1)(Arg2)...(Argn)构造函数(Arg1,Arg2,...,Argk);(Argk+1)...(Argn)
