如果没有调用函数,返回如何在Javascript中工作?

时间:2016-03-29 00:41:08

标签: javascript return call

我正在从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},这会引发错误。

5 个答案:

答案 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)); 的结果创建一个单独的变量,而只是立即调用新函数。