由一道面试题引起的arguments的思考

写一个按照下面方式调用都能正常工作的 sum 方法

console.log(sum(2,3)); // Outputs 5
console.log(sum(2)(3)); // Outputs 5
从这个输出的角度,我们需要求出函数的参数的和。
 1 function add(x){
 2         var fir = arguments[0];
 3         if (arguments.length ==2) {
 4             return arguments[0]+ arguments[1];
 5         }else{
 6             return function(sec){
 7                 return fir + sec;
 8             }
 9         }
10     }
11  add(2)(3);
12  add(2,3);             

这是我们需要缩写的sum函数。

 后面遇到一个新的问题,实现如下语法的功能:

var a = add(2)(3)(4); //9

输出:

还有一个更高级的做法:

最后输出:

这种方式对于add(1)和add(1)(2)也能达到效果,但对add(1,2)没效果。但需要理解下。

 还有一个终极版本:

 1 function add(){
 2      var args = Array.prototype.slice.call(arguments);
 3      var fn = function(){
 4          var arg_fn = Array.prototype.slice.call(arguments);
 5          return add.apply(null,args.concat(arg_fn));
 6      }
 7      fn.valueOf = function(){
 8          return args.reduce(function(a,b){
 9              return a + b;
10          })
11      }
12      return fn;
13  }
14   
15 console.log(add(1));
16 console.log(add(1,2)(3));
17 console.log(add(1,2)(3)(4));
18 console.log(add(1)(2)(3)(4)(5));

在这里使用到了Array.prototype.slice.call()方法,这种方法其实也可以单独写一篇文章了。这里就不在详述。

 

原文地址:https://www.cnblogs.com/xuzhudong/p/6509087.html