Please explain this Javascript closure exercise
我是一个Javascript的Noob,正试图围绕下面的闭包练习进行总结。
现在,我知道结果是122。任何人都能一步一步地引导我通过这个步骤(什么被传递到什么),这样我就能理解闭包是如何工作的吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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;
} |
- 你可以自己一步一步来帮自己。如果你对流程的某个特定部分是如何工作的感到困惑,那么这将是一个很好的问题。
- 谢谢你的帮助@dsg,pointy
为了理解这一点,您必须知道函数调用和对函数的引用之间的区别。以及范围如何在JavaScript中工作。
假设你知道这些事情,我们来解释一下。
因此,首先有一个变量hidden,它被赋值为mystery(3)。所以请立即查看函数mystery,看看它返回了什么。它返回对内部函数mystery2的引用。所以现在hidden持有一个引用,这意味着它没有实际的数值。接下来是第二个变量声明
var jumble = mystery3(hidden);。现在,为了知道jumble持有什么,您需要查看函数mystery3及其返回的值。它再次返回对内部函数mystery4的引用。现在有两个变量包含了对闭包mystery和mystery3内部函数的引用。
现在让我们来看看var result = jumble(2)。执行jumble(2)是对jumble持有引用的函数(即mystery4的实际函数调用。当mystery4运行时,您会看到它需要一个参数bonus,它是var result = jumble(2)行给出的2。返回param(6) + bonus。bonus是2,好的,但是什么是param(6)?这是给jumble的值:hidden,它是对mystery2的引用,记得吗?因此运行param(6)将使用参数6执行mystery2。
因此,追溯函数可能会有点混乱,但让我们用实际值来跟踪它,使其更清晰(如果这甚至是一个词的话)。
执行var result = jumble(2)将给我们一个param(6) + 2的返回值,以得到param(6),我们与multiplier = 6一起进入mystery2,在这里设置multiplier = 6 * input。我们的输入等于3+2=5,所以multiplier变成6*5=30,作为返回值,我们将它乘以4,即var secret。在执行mystery2结束时,我们拥有的值为120,在mystery4中返还给我们的param(6)。如果你还记得我们的bonus是2的话,120+2=122瞧!
我觉得我没能很好地解释这个问题,但这可能是我能做的最好的。希望有帮助!
- 太完美了!我错误地理解了参考值和数值。谢谢你@php_nub_qq