首先介绍下curry的概念:
使函数理解并处理部分应用的过程就叫做CURRY化:
例如,我想将add(x,y)方法转换成一个可以分成两部输入参数并正确计算结果的函数,我们就可以用到CURRY化的概念,javascript是一门动态性很强的语言,我们很容易实现这个效果:
代码如下:
function add(x,y){
if(typeof y === 'undefined'){
return function (y) {
return x + y;
}
}
return x + y;
}
这里将原始的x存储在闭包中,原始的y则作为局部变量复用。
这是结果:
add(3)
function (newy) {
return oldx + newy;
}
typeof add(3)
“function”
add(3)(4)
7
当我们的函数中传递的参数大多数都是相似的情况下,我们考虑使用CURRY化,现在我们可以写一个通用CURRY的函数:
function schonfinkelize(fn){
var slice = Array.prototype.slice,
stored_arg = slice.call(arguments,1);
return function () {
var new_arg = slice.call(arguments),
args = stored_arg.concat(new_arg);
return fn.apply(null,args);
}
}
我们可以将add函数CURRY化:
function add(x,y){
return x + y;
}
var newAdd = schonfinkelize(add,1);
newAdd(2,3)
3