面试的时候面试官出了一道题目很有意思。问的是这样的。假如我有一个方法add。如何实现形如add(1)(2)
调用返回3
这道题答案很简单,如下:
1 | function add (x) { |
但我当时第一时间的反应是这样的: 如何实现形如add(1)(2)(3)...(n)
这样的链式调用。
首先这个问题有两个难点:
- 1.如何解决累加结果的存储问题
- 2.如何解决他返回的方法可以作为结果来使用
首先这第一个问题是好解决的。只需要在内部存储计数器即可。而第二个问题是无法完全解决的。因为如果要实现链式调用那么返回必须是函数。而函数的typeof
值是function
, 永远不能作为一个number
使用。但是如果放宽限制。我们可以用过重写方法的toString
函数来实现对一些隐式调用转换为字符串的匹配。
代码如下:
1 | var sum = 0; |
当然,这里有个问题。就是封装性不好。会污染全局变量。那么我们把add方法做一下闭包处理进行优化一下:
1 | function add(x) { |