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