JavaScript 柯里化

定义: 柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
好像不是很好理解,我的理解是,柯里化其实是通过闭包的形式,返回函数,再用返回的函数去接受单一参数,如果需要,继续返回函数,去接受参数的的高级函数技术。过程中,柯里化可能要承担部分功能的实现。通过利用闭包缓存的方法。例如cuuryAdd中的s_arr数组就是通过闭包缓存到内存中,因为add函数引用了闭包,s_arr没有被释放。

就是 通过柯里化得到函数f,执行f(a)(b)(c)(d).....的形式

常见的bind的实现方式就是柯里化的典型例子。


实例1:柯里化的作用-----> 延迟计算/运行
var curryAdd = function(fn){
  var s_arr = [];
  return function(){
    if(!arguments.length){
      return fn.apply(null,s_arr);
    }
    else{
      s_arr = s_arr.concat([].slice.call(arguments));
      return arguments.callee;
    }
  }
};
var total = 0;
var add = curryAdd(function(){
  if(!arguments.length) return
  for(var i = 0,len = arguments.length; i < len; i++){
    total += arguments[i];
  }
  return total
})
add(9)(8)()

实例2:柯里化的作用----> 提前返回

var addEvent = (function(){
  if(window.addEventListener){
    return function(el,type,fn,capture){
      el.addEventListener(type,fn,capture);
    }
  }
  else{
    return function(el,type,fn,capture){
      el.attachEvent("on"+type,fn)
    }
  }
})()

addEvent(el,"click",function(){
  console.log(this.id);
},false)

初始addEvent的执行其实值实现了部分的应用(只有一次的if...else if...判定),而剩余的参数应用都是其返回函数实现的,典型的柯里化。

posted @ 2017-03-20 11:57  a fine day  阅读(100)  评论(0)    收藏  举报