使用带有无限参数的函数进行柯里化

2024-03-05

假设我有以下 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;
}

以及下面的柯里函数。

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] 被 [] 覆盖。有人可以向我提供有关如何进行这项工作的提示吗?谢谢


问题是fn范围为curryFunction所以在之间共享a and b.

您所要做的就是移动 的定义fn进入匿名返回函数。然后当您调用时会创建它f,以及有问题的fn.args =线路仅被调用一次。

Proof: jsFiddle http://jsfiddle.net/kLLJ5/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用带有无限参数的函数进行柯里化 的相关文章