您的add
函数不是很“实用”的部分原因是它试图做的不仅仅是将传递给它的数字相加。如果其他开发人员查看您的代码,查看一个add
函数,并且当他们调用它时,返回一个函数而不是总和,这会让其他开发人员感到困惑。
例如:
//Using your add function, I'm expecting 6
add(1,2,3) //Returns another function = confusing!
函数式方法
函数式方法是创建一个函数,允许您对任何其他函数进行柯里化,并简化您的add function
:
function curry(fn) {
var args = Array.prototype.slice.call(arguments, 1);
return function () {
return fn.apply(this, args.concat(
Array.prototype.slice.call(arguments, 0)
));
}
}
function add() {
var args = Array.prototype.slice.call(arguments);
return args.reduce(function (previousValue, currentValue) {
return previousValue + currentValue;
});
}
现在,如果你想咖喱这个函数,你只需要:
var curry1 = curry(add, 1);
console.log(
curry1(2), // Logs 3
curry1(2, 3), // Logs 6
curry1(4, 5, 6) // Logs 16
);
//You can do this with as many arguments as you want
var curry15 = curry(add, 1,2,3,4,5);
console.log(curry15(6,7,8,9)); // Logs 45
如果我还想加起来1, 2, 3
,我可以这样做:
add(1,2,3) //Returns 6, AWESOME!
继续功能方法
此代码现在可以从任何地方重用。
您可以使用该 curry 函数来创建其他 curry 函数引用,而无需任何额外的麻烦。
坚持数学主题,假设我们有一个乘法函数,它将所有传递给它的数字相乘:
function multiply() {
var args = Array.prototype.slice.call(arguments);
return args.reduce(function (previousValue, currentValue) {
return previousValue * currentValue;
});
}
multiply(2,4,8) // Returns 64
var curryMultiply2 = curry(multiply, 2);
curryMultiply2(4,8) // Returns 64
这种函数式柯里化方法允许您将这种方法用于任何函数,而不仅仅是数学函数。尽管提供的curry
函数不支持所有边缘情况,但它为您的问题提供了一个功能性的、简单的解决方案,可以轻松构建。