创建一个类似的函数和:sum(a)(b)= a + b并接受任意数量的括号。
任务取自this learning source。
function sum(a) {
var sum = a
function f(b) {
sum += b
return f
}
f.toString = function() { return sum }
return f
}
alert( sum(1)(2) ) // 3
alert( sum(5)(-1)(2) ) // 6
alert( sum(6)(-1)(-2)(-3) ) // 0
alert( sum(0)(1)(2)(3)(4)(5) ) // 15

任何人都可以解释它是如何工作的吗? A和B的论证很好,但是在代码中我们使用其他争论(在超过两个的情况下)? 为什么我们需要在这里使用toString方法?它与问题或警报有关。 另外,我尝试使用 console.log 而不是 alert 使用相同的代码,但它没有用。这里的问题是什么?
答案 0 :(得分:1)
从图片中取出警报,然后调用此代码:
sum(1)(2)
您可能对双括号感到困惑 - 这里发生的是您首先调用sum
函数,并将1
的参数传递给它。当您将1
传递给sum
时,您将1
设置为名为sum
的局部变量,然后将函数声明为f
并用作返回值来自sum
函数。
因此,由于您调用了sum
并返回了一个函数(f
),因此您可以使用参数2
调用 函数。< / p>
所以从本质上讲,你真的是这样做的:
var someFunc= sum(1);
someFunc(2);
可以像这样重写:
sum(1)(2);
答案 1 :(得分:0)
function sum(a) {
var sum = a
//return function f;
function f(b) {
sum += b
return f
}
//override of toString to print sum
f.toString = function() { return sum }
return f;
}
alert(sum(1)(2));
警告说明(sum(1)(2))
1.sum(1)首先返回一个带和值为1的闭包
f(b){
sum=sum+b; //sum=1 here from sum(1)
}
2.接下来f(2)被称为
sum=sum+b// sum=1,b=2 so sum=3
和f返回。由于f被覆盖,它打印的总和值为3