我正在尝试解决一个难题,但我却无计可施。
我应该创建一个像这样工作的函数:
add(1); //returns 1
add(1)(1); //returns 2
add(1)(1)(1); //returns 3
我知道这是可以做到的,因为其他人已经成功地完成了这个难题。我尝试了几种不同的方法来做到这一点。这是我最近的尝试:
function add(n) {
//Return new add(n) on first call
if (!(this instanceof add)) {
return new add(n);
}
//Define calc function
var obj = this;
obj.calc = function(n) {
if (typeof n != "undefined") {
obj.sum += n;
return obj.calc;
}
return obj.sum;
}
//Constructor initializes sum and returns calc(n)
obj.sum = 0;
return obj.calc(n);
}
这个想法是,在第一次通话时,一个新的add(n)
被初始化并且calc(n)
正在运行。如果calc
接收一个参数,它添加n
to sum
并返回自身。当它最终没有收到参数时,它返回的值sum
.
这在理论上是有道理的,但我无法让它发挥作用。有任何想法吗?
--edit--
我的代码只是我选择的路线。如果有人能想到一种不同的方法,我并不反对。
回答“这是如何工作的”。鉴于:
function add(n) {
function calc(x) {
return add(n + x);
}
calc.valueOf = function() {
return n;
}
return calc;
}
var sum = add(1)(2)(3); // 6
When add第一次被调用时,它将传入的值存储在一个名为的变量中n。然后返回该函数calc,它有一个闭包n和一个特别的valueOf方法(稍后解释)。
然后使用值 2 调用该函数,因此它调用add总和n + x
,即1 + 2
其中 3.
所以新版本calc返回,这次关闭n值为 3。
这个新的calc被调用的值为 3,所以它调用add with n + x
,这次是3 + 3
这是 6
Again add返回一个新的calc with n设置为 6。最后一次,calc不再被调用。返回值赋给变量sum。全部calc函数有特殊的valueOf替代标准方法提供的方法对象.原型 http://ecma-international.org/ecma-262/5.1/#sec-15.2.4.4。通常情况下valueOf只会返回函数对象,但在这种情况下它将返回值n.
Now sum可以用在表达式中,并且如果它valueOf方法被调用它将返回 6(即值n封闭举行)。
这看起来很酷,而且sum其行为很像一个原始数字,但它实际上是一个函数:
typeof sum == 'function';
因此,要小心严格测试事物的类型:
sum * 2 // 12
sum == 6 // true
sum === 6 // false -- oops!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)