首页 > 语言 > JavaScript > 正文

javascript currying返回函数的函数

2024-05-06 14:12:55
字体:
来源:转载
供稿:网友
最早期的curry函数有点多态的意味,就是根据函数参数在内部选用分支:
代码如下:
//http://www.openlaszlo.org/pipermail/laszlo-user/2005-March/000350.html
// ★★On 8 Mar 2005, at 00:06, Steve Albin wrote:

function add(a, b) {

if (arguments.length < 1) {

return add;

} else if (arguments.length < 2) {

return function(c) { return a + c }

} else {

return a + b;

}

}



var myadd = add( 2 );

var total = myadd(3);


日本的一个先行者可能在未搞清arguments也能用Array的原生方法转换为数组的时候,用非常复杂的正则与eval搞出一个更接近现代currying意味的函数。

代码如下:
function curry(fun) {

if (typeof fun != 'function') {

throw new Error("The argument must be a function.");

}

if (fun.arity == 0) {

throw new Error("The function must have more than one argument.");

}

var funText = fun.toString();

var args = /function .*/((.*)/)(.*)/.exec(funText)[1].split(', ');

var firstArg = args.shift();

var restArgs = args.join(', ');

var body = funText.replace(/function .*/(.*/) /, "");

var curriedText =

"function (" + firstArg + ") {" +

"return function (" + restArgs + ")" + body +

"}";

eval("var curried =" + curriedText);

return curried;
}


[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
接着是闭包的流行,与数组转换arguments的技术的发现,现代currying函数终于粉墨登场,就好像15~17世纪大航海时代的地理大发现,javascript的世界突然间开阔了许多。
代码如下:
//一个简单的现代currying函数
function curry (fn, scope) {
var scope = scope || window;
var args = [];
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选