柯里化(currying),维基百科的解释是“在计算机科学中,柯里化(Currying),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 哈斯凯尔·加里 命名的,尽管它是 Moses Schönfinkel 和 Gottlob Frege 发明的。”(http://zh.wikipedia.org/wiki/Currying)
微博上看到一群大牛们在说currying的事情,所以自己实现了一个把给定函数给柯里化的方法:
function curry(fn) {
var args = [];
var argLen = fn.length;
var currying = function(){
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
if (args.length >= argLen) {
return fn.apply(this, args);
} else {
return currying;
}
}
return currying;
}
/*以下测试*/
function fn(arg1, arg2, arg3, arg4) {
return arg1 + arg2 + arg3 + arg4;
}
f = curry(fn);
f(1,2)(3)(4);
搜索了一下,发现在2007年,大牛winter就有currying的实现(http://bbs.51js.com/forum.php?mod=viewthread&tid=74706),代码如下:
function currying(func)
{
return function()
{
if(arguments.length<func.length)
{
var args=arguments;
var retarg=new Array(func.length-arguments.length);
for(var i=0;i<retarg.length;i++)retarg="_"+i;
eval("var ret=function("+retarg+"){return args.callee.apply(this,Array.prototype.slice.call(args).concat(Array.prototype.slice.call(arguments)));}");
return currying(ret);
}
else return func.apply(this,arguments);
}
}
/////////////////////////////////////////////////////////////////////////////////////////
function f(a,b,c)
{
alert([a,b,c]);
}
var cuf=currying(f);
cuf(1)(2)(3);
