函数柯里化
什么是函数柯里化
在计算机可迷信中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把承受多个参数的函数变换成承受一个繁多参数(最后函数的第一个参数)的函数,并且返回承受余下的参数而且返回后果的新函数的技术。
柯里化疾速入门
接下来,咱们来通过一个例子来领会一下柯里化。
现有一个求两个数之和函数:
function add(a,b){ return a + b;}
将add函数柯里化变成:
function addCurrying(a){ return function (b){ return a + b; }}
能够看出,函数addCurrying承受原函数的第一个参数,并且返回了一个承受余下参数的函数,利用了闭包的个性存储了a的值。所以咱们通过下面的代码示例,咱们可能理解到柯里化函数的特点:
1、一个柯里化的函数首先会承受一下参数,承受了这些参数之后该函数并不会立刻求值,而是返回了另一个函数,刚承受的参数会在函数造成的闭包中保留下来。
2、等到函数须要被真正求值时即原函数所需参数全副接管完,会对闭包中存储的数据一并求值。
函数柯里化的理论利用
通过下面的例子,咱们体验到了什么是柯里化函数。
然而问题来了,费了这么大劲封装一层,到底有什么用途呢
没有益处想让咱们程序员多干事件是不可能滴,这辈子都不可能
所以接下来咱们就来看一下函数柯里化的二个理论利用。
参数复用
就是将雷同的参数固定下来
// 失常正则验证字符串reg.test(txt)//函数封装后function check(reg,txt){ return reg.test(txt);}//即便是雷同的正则表达式,也须要从新传递一次console.log(check(/\d+/,'test1')) //trueconsole.log(check(/\d+/,'testt')) //false//柯里化(currying)后function checkCurrying(reg){ return function (txt){ return reg.test(txt); }}var hasNumber = checkCurring(/\d+/);console.log(hasNumber('test1'));console.log(hasNumber('testt'));
能够看出当将check函数柯里化后能够固定同一正则表达式这一参数,失去一个只须要接管须要检测的字符串的函数。达到了参数复用的目标。
提前确认
var on = 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(){})var onCurrying = (function(){ if(document.addEventListener){ return function(element,event,handler){ if(element && event && handler){ element.addEventListener(event,handler,false); } } }else{ return function(element,event,handler){ if(element && event && handler){ element.attachEvent('on' + event,handler); } } }})()on(div,'click',function(){})
咱们在做我的项目的过程中,封装DOM的操作能够说再失常不过,下面第一种写法也是比拟常见,然而咱们看看第二种写法,它绝对于第一种写法就是自执行而后返回一个新的函数,这样就提前确定了会走哪一个办法,防止每次都进行判断。
封装通用柯里化函数
接下来咱们来封装一个通用的柯里化函数。
function currying(){ var fn = arguments[0]; var args = [].slice.call(arguments,1); if(fn.length === args.length){ return fn.apply(this,args); }else{ function _currying(){ args.push(...arguments); if(fn.length === args.length){ return fn.apply(this,args); }else{ return _currying; } } return _currying; }}
总而言之,函数柯里化就是将function(Arg1,Arg2,...,Argn)变成function(Arg1)(Arg2)...(Argn)或者function(Arg1,Arg2,...,Argk)(Argk+1)(Argn)