今天在群里看到有人提出一个问题,关于如何实现如下效果的sum函数:
1 sum(1,2); => 3 2 sum(1)(2); => 3
本能想到是在考察函数柯里化的知识,但是仔细一看,发现其实难点在于如何让函数的返回值既是函数又是一个简单值。我想了想,做了一个拓展版的函数,支持 sum(1,2,3)(1,2,3) => 12 这样的多参数相加,代码如下,转载请注明出处。
1 function sum(num1) { 2 3 var argus1 = arguments, 4 count; 5 6 function add(arugs) { 7 8 var len = arugs.length, 9 i = 0, 10 _sum = 0; 11 12 for (i; i<len; i++) { 13 _sum += arugs[i]; 14 } 15 16 return _sum 17 } 18 19 function doCount(num2) { 20 21 count = add(argus1); 22 23 if (typeof num2 != 'undefined') { 24 25 var argus2 = arguments, 26 all = 0; 27 28 all = count + add(argus2); 29 30 return all; 31 32 } 33 34 return count; 35 } 36 37 doCount.valueOf = function(){ 38 39 return doCount(); 40 41 }; 42 43 return doCount; 44 45 }
这个方法有点hack的意味,因为他其实利用了函数return时会默认使用valueOf方法的原理,通过改写valueOf实现的。