如何实现方法既能实现函数式编程又能获取结果进行比较——实现形如add(1)(2)(3)...(n)的方法

面试的时候面试官出了一道题目很有意思。问的是这样的。假如我有一个方法add。如何实现形如add(1)(2)调用返回3
这道题答案很简单,如下:

1
2
3
4
5
function add (x) {
return function (y) {
return x + y;
}
}

但我当时第一时间的反应是这样的: 如何实现形如add(1)(2)(3)...(n)这样的链式调用。
首先这个问题有两个难点:

  • 1.如何解决累加结果的存储问题
  • 2.如何解决他返回的方法可以作为结果来使用

首先这第一个问题是好解决的。只需要在内部存储计数器即可。而第二个问题是无法完全解决的。因为如果要实现链式调用那么返回必须是函数。而函数的typeof值是function, 永远不能作为一个number使用。但是如果放宽限制。我们可以用过重写方法的toString函数来实现对一些隐式调用转换为字符串的匹配。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
var sum = 0;
function add(x) {
sum += x;
return add;
}
add.toString = function() {
return sum;
}

var result = add(1)(2)(3);
console.log(typeof result); // 返回function
console.log(result + ''); // 返回6
console.log(result == 6); // 返回true

当然,这里有个问题。就是封装性不好。会污染全局变量。那么我们把add方法做一下闭包处理进行优化一下:

1
2
3
4
5
6
7
8
9
10
11
function add(x) {
var sum = x;
function tmp(y) {
sum += y;
return tmp;
}
tmp.toString = function() {
return sum;
}
return tmp;
}

文章目录