柯里化(curry)

柯里化就是一个函数的返回值也是一个函数,并且返回值函数需要使用宿主函数的参数,才可以完成自身的计算。

下面是一个通用curry化函数:

function schonfinkelize(fn) {  
    var slice = Array.prototype.slice,  
    stored_args = slice.call(arguments, 1);  
    return function () {  
        var new_args = slice.call(arguments),  
        args = stored_args.concat(new_args);  
        return fn.apply(null, args);  
  };  
}  

应用例子如下:

// a curried add  
// accepts partial list of arguments  
function add(x, y) {  
  if (typeof y === "undefined") { // partial  
    return function (y) {  
        return x + y;  
    };  
  }  
  // full application  
  return x + y;  
} 

调用:add(3)(4); // 7

何时使用curry化

当你发现你调用同一个的函数,而传递的参数大部分都是一样的时候,那么这个参数就是一个很好的可以柯里化的候选函数。

你可以动态创建一个新函数,部分应用一组参数到你的函数。接着新函数会存储重复的参数(那么你就不用每次都传递),并且会用它们去填充原始函数需要的参数列表。

results matching ""

    No results matching ""