Javascript函数调用不同的调用时尚

时间:2017-10-07 11:01:52

标签: javascript function

我想在javascript中实现该功能,让我们说Add应该支持以下格式

add(a,b,c)
add(a)(b)(c)
add(a)(b,c)
add(a,b)(c)

所有这些都应该返回a+b+c。可能吗?如果是这样的话?

2 个答案:

答案 0 :(得分:1)

您可以执行类似

的操作

function add(){
    let sum = 0;
    for(let e of arguments) sum += e;
    let ret = add.bind(null, sum);
    ret.toString = () => sum;
    ret.valueOf = () => sum;
    return ret;
}


let x = +add(2, 3)(4)(11)
console.log(x, typeof x);

答案 1 :(得分:1)

每当运行该函数时,将arguments object参数收集到一个数组中,并检查它的长度。如果数组的长度为3或更大,则使用Array#reduce将前3个数字相加。如果没有,请返回该功能。

function add() {
  var args = []; // collect the arguments

  function innerAdd() {
    args.push.apply(args, arguments); // add the arguments to args
    
    // if the length of args is under 3 return innerAdd, if not sum the first 3 numers
    return args.length < 3 ? innerAdd : args.slice(0, 3).reduce(function(s, n) {
      return s + n;
    });
  }
  
  return innerAdd.apply(null, arguments); // invoke innerAdd with current arguments
}

var a = 1, b = 2, c = 3;

console.log(add(a,b,c));
console.log(add(a)(b)(c));
console.log(add(a)(b,c));
console.log(add(a,b)(c));