首先介绍下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