Javascript 使用具有无限参数的函数
假设我有下面的add函数,它接受无限数量的参数Javascript 使用具有无限参数的函数,javascript,Javascript,假设我有下面的add函数,它接受无限数量的参数 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; } var addall = (...a) => a.red
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;
}
var addall = (...a) => a.reduce((p,c) => p + c);
然后我想做一些类似的事情:
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]正在被[]覆盖。有人能给我一个如何使这项工作的提示吗?谢谢问题在于
fn
的作用域是curryFunction
,因此在a
和b
之间共享
您所要做的就是将fn
的定义移动到匿名返回函数中。然后在调用f
时创建它,并且有问题的fn.args=
行只被调用一次
证明:.curry一个无限多参数的函数可以实现如下: 假设我们有一个名为
addAll()
的函数,它返回所有提供参数的总和
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;
}
var addall = (...a) => a.reduce((p,c) => p + c);
我们有一个curry函数,它接受一个函数并无限返回curry版本,直到调用返回的函数时没有参数,只有当前面提供的所有参数的结果都返回时。好的,这是curry
函数
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 curry = f => (...a) => a.length ? curry(f.bind(f,...a))
: f();
让我们看看它在行动
var addAll=(…a)=>a.reduce((p,c)=>p+c),
咖喱=f=>(…a)=>a.长度?咖喱,
咖喱=咖喱(addAll),
结果=咖喱(10,11)(10)(37)(10,17,42)();
控制台日志(结果);
结果=货币(“a”、“b”)(“c”)(“d”)(“e”、“f”、“g”)();
控制台日志(结果)代码>什么是fn.args
应该是什么?编辑哦,等等,我明白了,你会如何告诉它何时停止返回函数并给出实际结果?@Qantas94Heavy我想这就是问题所在,类似的事情可以用咖喱来完成吗?