如何使用add(num1)(num2)(num3)这样的函数来连续添加数字?

时间:2015-06-23 02:34:56

标签: javascript

如何编写如下函数?

add(num1)(num2)(num3)...

示例:

add(10)(10)=20

add(10)(20)(30)=60

add(10)(20)(30)(40)=100

我怎样才能实现这个功能?

3 个答案:

答案 0 :(得分:3)

我不知道你为什么要创建这样的功能。不过,我会写如下:



alert(add(10)(10));         // 20
alert(add(10)(20)(30));     // 60
alert(add(10)(20)(30)(40)); // 100

function add(x) {
    adder.toString = adder.valueOf = result;

    return adder;

    function adder(y) {
        return add(x + y);
    }

    function result() {
        return x;
    }
}




它是如何运作的?

  1. 当您致电add(10)时,结果为function adder(y) { return add(10 + y); }。这允许您链接add函数,在移动时累积总和。因此,您可以编写add(10)(20)(30)(40)。结果始终是一个功能。
  2. 但是,结果函数可以通过toStringvalueOf函数强制转换为数字,只要预期基元而不是对象,JavaScript函数会自动调用这些函数。因此,您始终可以将结果函数视为数字,从而可以编写5 * add(10)(10)等表达式。
  3. 有什么好处?

    1. A.J's solution相比,我们没有使用任何可变状态。因此,每次要创建新链时,都不需要将计数器变量c重置为零。此外,您可以保存任何中间值并在以后使用它而不必担心它会改变:

      var a = add(10)(20)(30); // 60
      var b = a(40);           // 100
      alert(a);                // still 60
      
    2. Darshan N Reddy's solution(也使用可变状态)相比,我们不需要在链的末尾进行最终.res()方法调用以获得结果(尽管我们可以在最后写.valueOf()。由于JavaScript解释器会自动调用toStringvalueOf,因此您只需将生成的函数视为数字。

    3. 希望有所帮助。但是,我仍然没有看到编写这些功能的必要性。你的实际用例是什么?

答案 1 :(得分:1)

您只需要返回功能:

var c = 0;

var div = document.querySelector("div");

function add(value) {
    c += value;
    div.innerHTML = c;
    return add;
}

add(10)(20)(30);
<div></div>

每次调用函数时都要c = 0来获得正确的答案。

答案 2 :(得分:0)

这可以通过在javascript中使用闭包来实现。

function add(x){
  return function(y){
    return x + y;
  };
}

在上面的代码中,对函数的第一次调用返回一个函数,该函数接受一个参数,并且由于x的闭包值仍然可用于内部函数,因此它返回x和y的总和。

add(10)(10); //return 20

如果你想让3个电话真实,那么

function add(x){
  return function(y){
    return function(z){
       return x+y+z; 
     };
  };
}

由于您希望使用无限数量的呼叫,而您事先不知道,您可以进行黑客攻击并使其正常工作,

function sum(x) {

  var sum = x;    
  function func(y) {
    sum =sum+y;
    return func;
  }
  func.res = function() { return sum }   //this is the hack 
  return func;
}

在添加时,您可以调用

sum(45)(4)(1).res();