Javascript中currying的实现
2010-09-14 13:39:36 来源:WEB开发网本文示例源代码或素材下载
Currying好像是函数式语言都有的一个特性,比如Perl,Python,Javascript。
那么到底什么是Currying,我是在学习Closure时无意中接触到这个定义的,觉得很是有趣。
先看看 Wiki 中的定义:
Curryingis the technique of transforming afunctionthat takes multiplearguments
in such a way that it can be called as a chain of functions each with a single argument.
大概的意思就是说,将拥有多个参数的函数Currying化为拥有单一参数的函数形式。
下面举一个简单的例子说明Javascript中的Currying实现,一个简单的求和函数:
functionadd(x,y){
returnx+y;
}
console.log('add(2,3)=='+add(2,3));
对其进行Currying,及调用方法:
functioncurry_add(x){
returnfunction(y){
returnx+y;
}
}
console.log('curry_add(2)(3)=='+curry_add(2)(3));
注意,curry_add(2) 返回的是函数。
我们还可以定义一个通用的 curry 函数:
functioncurry(fn){
varargs=[];
for(vari=1;i<arguments.length;i++){
args.push(arguments[i]);
}
returnfunction(){
for(vari=0;i<arguments.length;i++){
args.push(arguments[i]);
}
returnfn.apply(window,args);
}
}
这个函数至少接收一个参数(需要curry的函数),对于前面的 add 函数,我们可以这样来调用:
console.log('curry(add)(2,3)=='+curry(add)(2,3));
console.log('curry(add,2)(3)=='+curry(add,2)(3));
console.log('curry(add,2,3)()=='+curry(add,2,3)());
因为 curry(add, 2) 或 curry(add) 返回的还是函数,所以我们还可以对其进行Currying,如下代码:
console.log('curry(curry(add),2)(3)=='+curry(curry(add),2)(3));
console.log('curry(curry(add,2),3)()=='+curry(curry(add,2),3)());
运行时截图:
Tags:Javascript currying 实现
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接