需要帮助了解Javascript关闭

时间:2014-02-18 22:27:00

标签: javascript closures

我正在学习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;

谢谢。

1 个答案:

答案 0 :(得分:6)

让我们一步一步地分析。

第一个电话是mystery,参数为3

mystery做什么?它定义了一个变量secret,其值为4,然后将2添加到input

所以在mystery的前两行之后,你有:

secret = 4;
input = 5;

然后你有一个名为mystery2的嵌套函数,它接受一个名为multiplier的参数。在第一行中,它将inputmultiplier相乘,然后返回secret * multiplier。我们不知道multiplier的值,但我们执行知道值secretinput。你可能想知道那是怎么回事。好吧,在JavaScript中创建闭包时,它是词法绑定到当前作用域。这只是一种奇特的方式,说闭包“知道”在闭包本身创建的同一范围内创建的所有局部变量。此行为也适用于嵌套函数,这就是为什么它们可以在JavaScript中充当闭包的原因。那么这意味着mystery2,当它最终被调用时,secret设置为4input设置为5。因此,mystery2mystery返回,它知道这两个值。因此,执行后,变量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 * multiplier4 * 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 * 30120param(6)。因此120的返回值为bonus。要值,我们会在mystery4中添加mystery4。我们使用2参数调用120 + 2,因此我们有122,这意味着最终结果为{{1}}。

希望这会帮助你!