关于函数柯里化

今天在群里看到有人提出一个问题,关于如何实现如下效果的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实现的。

原文地址:https://www.cnblogs.com/libinfs/p/5948787.html