我正在尝试解决一个难题,但我已经无计可施了。
我应该做一个像这样工作的函数:
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
添加到 sum
并返回自身。当它最终没有收到参数时,它返回 sum
的值。
这在理论上是有道理的,但我无法让它发挥作用。有什么想法吗?
--编辑--
我的代码就是我选择的路线。如果有人能想到一个不同的方法,我不反对。
最佳答案
回答“这是如何工作的”。鉴于:
function add(n) {
function calc(x) {
return add(n + x);
}
calc.valueOf = function() {
return n;
}
return calc;
}
var sum = add(1)(2)(3); // 6
当第一次调用 add 时,它将传入的值存储在名为 n 的变量中。然后它返回函数 calc,它有一个到 n 的闭包和一个特殊的 valueOf 方法(稍后解释)。
然后调用此函数并使用值 2,因此它调用 add 并使用 n + x
的总和,即 1 + 2
哪个 3.
因此返回了一个新版本的 calc,这次带有一个值为 3 的 n 的闭包。
这个新的 calc 被调用时值为 3,所以它用 n + x
调用 add,这次是 3 + 3
即 6
add 再次返回一个新的 calc,n 设置为 6。这最后一次,calc 不是我又打来了。返回值分配给变量sum。所有的calc 函数都有一个特殊的valueOf 方法来替代Object.prototype 提供的标准方法。 .通常 valueOf 只会返回函数对象,但在这种情况下它将返回 n 的值。
现在 sum 可以用在表达式中,如果它的 valueOf 方法被调用,它将返回 6(即 n 的值在闭包中)。
这看起来很酷,sum 的行为很像一个原始数字,但它实际上是一个函数:
typeof sum == 'function';
所以要小心严格地测试事物的类型:
sum * 2 // 12
sum == 6 // true
sum === 6 // false -- oops!!
关于javascript - 拼图 : JS Function that returns itself until there are no arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25578728/