我正在学习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;
谢谢。
最佳答案
让我们逐步分析这一点。
第一个调用是使用参数mystery
的3
。mystery
是做什么的?它使用值secret
定义了一个变量4
,然后将2
添加到input
。
因此,在mystery
的前两行之后,您将拥有:
secret = 4;
input = 5;
然后,您有一个名为
mystery2
的嵌套函数,该函数接受一个名为multiplier
的参数。在第一行中,它将input
乘以multiplier
,然后返回secret * multiplier
。我们不知道multiplier
的值,但是我们做知道值secret
和input
。您可能想知道这是怎么回事。好吧,在JavaScript中,当您创建一个闭包时,它依词法绑定(bind)到当前作用域。这只是一种说法,即闭包“知道”在与创建闭包本身相同的作用域中创建的所有局部变量。此行为也适用于嵌套函数,这就是为什么它们可以在JavaScript中充当闭包的原因。因此,这意味着mystery2
最终被调用时,会将secret
设置为4
,并将input
设置为5
。因此,从mystery2
返回了知道这两个值的mystery
。因此,执行后,变量hidden
不包含值,而是包含对mystery2
实例的引用,其中secret
和input
的值是我前面提到的值。这有什么好处?好处是您可以拥有
mystery2
的多个副本,这些副本根据传递给input
的内容“知道” mystery
的不同值。所以在这里,mystery
有点像mystery2
的构造函数。现在,我们有
hidden
指向mystery2
的实例。因此,在这种情况下,hidden
是我们自己的mystery2
特殊副本的别名。在下一行中,您调用
mystery3
并将hidden
作为参数传递。 mystery3
内部会发生什么?好的mystery3
接受一个叫做param
的参数,然后它做类似于mystery
的事情;它返回一个函数。此功能有什么作用?它接受一个名为bonus
的参数。然后它执行param(6) + bonus
。那是什么意思?
什么是
param
?这是传递给mystery3
的参数。由于mystery4
的行为类似于闭包,因此它“了解” param
。但是实际上,param
是什么?好吧,param
是hidden
,它指向我们的mystery2
的特殊实例!现在这里是我们实际评估mystery2
的地方:我们使用6
的参数调用它,它将是multiplier
的值。所以现在您有了multiplier *= input
。 input
“知道”的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
设置为mystery2
。 mystery2
“知道” input
是5
(这是我们在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/