我正在学习javascript闭包,并且难以理解这个概念。如果有人能很好地指导我完成本示例,即输入和输出要去的地方,我将不胜感激。

var hidden = mystery(3);
var jumble = mystery3(hidden);
var result = jumble(2);

function mystery ( input ){
  var secret = 4;
  input+=2;
  function mystery2 ( multiplier ) {
    multiplier *= input;
    return secret * multiplier;
  }
  return mystery2;
}
function mystery3 ( param ){
  function mystery4 ( bonus ){
    return param(6) + bonus;
  }
  return mystery4;
}
results;

谢谢。

最佳答案

让我们逐步分析这一点。

第一个调用是使用参数mystery3
mystery是做什么的?它使用值secret定义了一个变量4,然后将2添加到input

因此,在mystery的前两行之后,您将拥有:

secret = 4;
input = 5;

然后,您有一个名为mystery2的嵌套函数,该函数接受一个名为multiplier的参数。在第一行中,它将input乘以multiplier,然后返回secret * multiplier。我们不知道multiplier的值,但是我们知道值secretinput。您可能想知道这是怎么回事。好吧,在JavaScript中,当您创建一个闭包时,它依词法绑定(bind)到当前作用域。这只是一种说法,即闭包“知道”在与创建闭包本身相同的作用域中创建的所有局部变量。此行为也适用于嵌套函数,这就是为什么它们可以在JavaScript中充当闭包的原因。因此,这意味着mystery2最终被调用时,会将secret设置为4,并将input设置为5。因此,从mystery2返回了知道这两个值的mystery。因此,执行后,变量hidden不包含值,而是包含对mystery2实例的引用,其中secretinput的值是我前面提到的值。

这有什么好处?好处是您可以拥有mystery2的多个副本,这些副本根据传递给input的内容“知道” mystery的不同值。所以在这里,mystery有点像mystery2的构造函数。

现在,我们有hidden指向mystery2的实例。因此,在这种情况下,hidden是我们自己的mystery2特殊副本的别名。

在下一行中,您调用mystery3并将hidden作为参数传递。 mystery3内部会发生什么?好的mystery3接受一个叫做param的参数,然后它做类似于mystery的事情;它返回一个函数。此功能有什么作用?它接受一个名为bonus的参数。然后它执行param(6) + bonus

那是什么意思?

什么是param?这是传递给mystery3的参数。由于mystery4的行为类似于闭包,因此它“了解” param。但是实际上,param是什么?好吧,paramhidden,它指向我们的mystery2的特殊实例!现在这里是我们实际评估mystery2的地方:我们使用6的参数调用它,它将是multiplier的值。所以现在您有了multiplier *= inputinput“知道”的mystery2的值为5。所以我们基本上有了6 * 5,这意味着multiplier现在设置为30。然后,我们返回secret * multiplier,即4 * 30,即120。因此,这意味着param(6)返回120,然后将其添加到bonus中。请记住,只有当我们实际执行mystery4时,这种情况才会发生。

什么时候执行mystery4?在我们调用mystery3之后,我们返回mystery4的副本,然后将其分配给jumble。之后,我们调用jumble(2)。那么jumble是什么?本质上是这样的:
function mystery4(bonus) {
    return param(6) + bonus
}

什么是param?好吧,基本上就是mystery2:
function mystery2 ( multiplier ) {
    multiplier *= input;
    return secret * multiplier;
}

让我们再次进行计算。当我们调用param(6)时,我们基本上在multiplier中将6设置为mystery2mystery2“知道” input5(这是我们在mystery内部计算的)。因此multiplier *= input意味着multiplier现在是30。然后我们执行secret * multiplier,即4 * 30,即120。因此,param(6)的返回值为120。为此,我们在bonus内添加mystery4。我们使用参数mystery4调用了2,因此我们有了120 + 2,这意味着最终结果是122

希望这可以帮助你!

关于javascript - 需要帮助来了解Javascript关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21866826/

10-09 23:29