curring又称为部分求值,一个curring的函数,会首先接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另一个函数,刚才传入的参数在函数形成的闭包中被保存起来,待到函数真正需要求值的时候,之前传入的所有参数都会被一次性用于求值 。
何时使用curry
当发现正在调用同一个函数,并且传递的参数绝大多数都是相同的,那么该函数可能是用于curry化的一个很好的候选参数。可以通过将一个函数集合部分应用到函数中,从而动态创建一个新函数。
curry化函数的示例1
function curring(fn){
var slice =
Array.prototype.slice,
stored_args = slice.call(
arguments,
1);
return function() {
var new_args = slice.call(
arguments),
args = stored_args.concat(new_args);
return fn.apply(
null, args);
};
}
function add(a, b, c, d, e){
return a + b + c + d + e;
}
curring(add,
1,
2,
3)(
5,
5);
var addone = curring(add,
1);
addOne(
10,
10,
10,
10);
var addSix = curring(addOne,
2,
3);
addSix(
5,
5);
《Javascript patterns》 Page87
示例2
var curring =
function(fn){
var args = [];
return function(){
if(
arguments.length ===
0){
return fn.apply(
this,args);
}
else{
[].push.apply(args,
arguments);
return arguments.callee;
}
}
}
var cost = (
function(){
var money =
0;
return function(){
for(
var i=
0;i <
arguments.length;i++){
money +=
arguments[i];
}
return money;
}
})();
var cost1 = curring(cost);
cost1(
100);
cost1(
200);
cost1(
300);
alert(cost1());
Javascript设计模式与开发实践 page50
转载请注明原文地址: https://ju.6miu.com/read-950274.html