假设我有以下添加函数,它接受无限数量的参数。
function add () {
var total = 0;
var args = Array.prototype.slice.call(arguments, 0);
for (var i=0; i<args.length; i++) {
total += arguments[i];
}
return total;
}
以及以下咖喱功能。
function curryFunction(orig_func) {
var ap = Array.prototype;
var args = arguments;
function fn() {
if (arguments.length != 0) {
ap.push.apply(fn.args, arguments);
return fn;
} else {
return orig_func.apply(this, fn.args);
}
};
return function() {
fn.args = ap.slice.call( args, 1 );
return fn.apply( this, arguments );
};
}
然后我想做类似的事情:
var f = curryFunction(add);
var a = f(3)(4)(3);
var b = f(10)(3);
var result1 = a(); // returns 10
var result2 = b(); // returns 13
然而,对于a()和b()我总是得到13,我认为是因为在行
fn.args = ap.slice.call(args, 1);
用[]覆盖现有数组[3,4,3]。有人可以提供一些关于如何使这项工作的提示吗?感谢
答案 0 :(得分:5)
问题是fn
的范围限定为curryFunction
,因此会在a
和b
之间共享。
您所要做的就是将fn
的定义移到匿名返回函数中。然后在您拨打f
时创建,有问题的fn.args =
行只会被调用一次。
证明:jsFiddle。
答案 1 :(得分:1)
使用无限多个参数的函数进行计算可以按如下方式实现;
假设我们有一个名为addAll()
的函数,它返回所有提供的参数的总和。
var addall = (...a) => a.reduce((p,c) => p + c);
我们有一个curry函数,它接受一个函数并返回curried版本 ad infinitum ,直到返回的函数被调用而没有参数,只有当返回所有先前提供的参数的结果时。好的,这是curry
函数。
var curry = f => (...a) => a.length ? curry(f.bind(f,...a))
: f();
让我们看看它的实际效果;
var addAll = (...a) => a.reduce((p,c) => p + c),
curry = f => (...a) => a.length ? curry(f.bind(f,...a)) : f(),
curried = curry(addAll),
result = curried(10,11)(10)(37)(10,17,42)();
console.log(result);
result = curried("a","b")("c")("d")("e","f","g")();
console.log(result);
&#13;