使用无限参数的函数进行干扰

时间:2014-01-08 02:52:09

标签: javascript

假设我有以下添加函数,它接受无限数量的参数。

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]。有人可以提供一些关于如何使这项工作的提示吗?感谢

2 个答案:

答案 0 :(得分:5)

问题是fn的范围限定为curryFunction,因此会在ab之间共享。

您所要做的就是将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();

让我们看看它的实际效果;

&#13;
&#13;
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;
&#13;
&#13;