关于javascript:函数柯里化

33次阅读

共计 2099 个字符,预计需要花费 6 分钟才能阅读完成。

函数柯里化

什么是函数柯里化

在计算机可迷信中,柯里化 (英语: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'))  //true
console.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)

正文完
 0