柯里化(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);

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

required