Javascript 使用具有无限参数的函数

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

假设我有下面的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.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我想这就是问题所在,类似的事情可以用咖喱来完成吗?