我正在从site学习并找到了这个问题和答案:
编写一个sum方法,该方法在使用其中任何一个调用时都能正常工作 语法如下。
console.log(sum(2,3)); // Outputs 5
console.log(sum(2)(3)); // Outputs 5
//应答
function sum(x) {
if (arguments.length == 2) {
return arguments[0] + arguments[1];
} else {
return function(y) { return x + y; };
}
}
我理解if语句中的代码,但不理解else语句中的代码,因为它只是返回一个函数。该函数不会被'()'调用,所以鉴于console.log(sum(2)(3));
的第二种情况,我不明白它为什么会返回5.我只能看到它会返回function(3) {return 2 + 3}
,这会引发错误。
答案 0 :(得分:3)
sum(2) = function (y){ return 2 + y }
您正在使用(3)
答案 1 :(得分:2)
您可以将函数存储在变量中。
基本理念是
var foo = function(y) {
return y
};
所以当我们看看
console.log(sum(2)(3));
可以写成
var part1 = sum(2); //aka part1 = function(y) { return 2 + y; };
var ans = part1(3);
console.log(ans);
答案 2 :(得分:2)
else语句返回一个函数,其中x值是从第一次调用中封装的
要解释它会将其分解一下
var fresult = sum(3);
// right now fresult is a function that will add 3
// to the variable you call fresult with
// basically function(y){ return 3 + y; }
var result = fresult(4);
//result is 7
console.log(result);
可以认为x 的值正在被函数捕获,然后您可以调用
这个封装是由在else的return语句中的匿名函数中创建的闭包创建的
要了解有关闭包的更多信息,请查看this MDN Article about them,他们将能够比我更好地解释它。
他们实际上有一个与你非常相似的例子,他们试图将这个概念解释为与工厂类似:
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12
文章说:
在这个例子中,我们定义了一个函数makeAdder(x),它取一个 单个参数x并返回一个新函数。它返回的功能 采用单个参数y,并返回x和y的总和。
从本质上讲,makeAdder是一个函数工厂 - 它创建函数 这可以为他们的参数添加一个特定的值。在上面的例子中 我们使用函数工厂创建两个新函数 - 一个 它的参数增加了5,并且增加了10。
add5和add10都是闭包。它们共享相同的功能体 定义,但存储不同的环境。在add5的环境中,x 是5.就add10而言,x是10。
因此,如果您习惯于更传统的编程语言,那么您对私有变量的一些用例与在闭包中捕获变量值相同
答案 3 :(得分:1)
else
部分是anonymous function,接受one
参数。
如果sum(2)(3)
进入else循环,x = 2
,因为它被称为sum(2)
,而(3)
是一个没有名字的匿名函数。
因此,
return function(y) { return x + y; };
变为
return function(3) { return 2 + 3; };
答案 4 :(得分:1)
Javascript与许多语言略有不同。函数可以作为变量传递。在您的情况下,当分解为实际发生的步骤时,更容易看到发生的事情。
首先,由于a
只有一个参数,我们会转到您已经知道的sum(2)
块。发生了什么,我们正在返回一个函数,用else
替换传递给x
的变量。所以基本上,返回的是一个返回sum(x)
的函数。如果我们想把它自己写出来,那就是它的样子:
2 + y
function(y) {
return 2 + y;
}
中的第二组括号基本上是说"调用sum(2)(3)
返回的函数并将参数sum(2)
发送给它。
这里基本上是整个操作的扩展版本:
3
短版本基本上只是跳过为function sum(x) {
if (arguments.length == 2) {
return arguments[0] + arguments[1];
} else {
return function(y) { return x + y; };
}
}
var addTwo = sum(2);
console.log(addTwo(3));
的结果创建一个单独的变量,而只是立即调用新函数。