创建一个函数,在连续调用时将数字加在一起

时间:2015-02-11 14:26:44

标签: javascript

我需要一个能够返回以下输出的函数。

add(1)     =  1
add(1)(2)  =  3
add(1)(2)(3) = 6

同样,函数应该返回结果。

我想要一个函数function add(){}来执行上述任务。

请帮助我使用优化的解决方案

4 个答案:

答案 0 :(得分:2)

感谢@ermouth initial code

var add = (function() {
    var factory = function(value) {
        var fn = function(num) {
            return factory(value + num);
        };
        // This is the main hack: 
        // We will return a function that when compared / concatted will call .toString and return a number.
        // Never use this in production code...
        fn.toString = function() {
            return value;
        };
        return fn;
    };
    return factory(0);
})();

add(1); // 1
add(1); // 1
add(1)(2); // 3
add(1)(2)(3); // 6

但要注意平等比较:

add(2) == add(2) // false
add(2) > add(1) // true
add(2) < add(1) // false

答案 1 :(得分:0)

您应该将函数包装在闭包中并重新定义函数的toString方法。

var add = (function(initNum) {
    var current = initNum || 0;
    var fn = function(num) {
        current += num;
        return fn;
    };
    fn.toString = function() {
        return current
    };
    return fn;
})(0);

add(1)1,然后add(2)(3)(4)10

答案 2 :(得分:-2)

试试这个:

function add() {
   var erg = 0;
   for(var i in arguments)
       erg += arguments[i];
   return erg; 
}

您可以像添加(1,2,3);

一样调用它

答案 3 :(得分:-3)

您遇到了一个技巧问题,或者您误解了问题

你不能编写一个在纯JavaScript(或者几乎任何其他语言)中执行此操作的函数。问题是它必须在上次调用时返回一个数字,并在其他所有时间返回一个函数。 这是可行的如果你提前知道你的函数被调用多少次,但如果我正确理解你的问题,那么你事先就不知道了。你需要能够预知未来,知道最后一次调用函数的时间。

您也可以使用带有宏的语言执行此操作,以便在运行代码时检查代码的语法。这会让你知道当前的调用链有多长,所以你知道何时返回一个数字而不是一个函数。但JavaScript不会这样做;事实上,大多数语言都没有。

你的访调员是否可能正在寻找一个带有可变数量参数的add()函数?这更容易:

function add() {
    return Array.prototype.reduce.call(
        arguments,
        function (sum, next) {
            return sum + next;
        },
        0
    );
}