请解释这个javascript闭包练习

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;
}


为了理解这一点,您必须知道函数调用和对函数的引用之间的区别。以及范围如何在JavaScript中工作。

假设你知道这些事情,我们来解释一下。

因此,首先有一个变量hidden,它被赋值为mystery(3)。所以请立即查看函数mystery,看看它返回了什么。它返回对内部函数mystery2的引用。所以现在hidden持有一个引用,这意味着它没有实际的数值。接下来是第二个变量声明
var jumble = mystery3(hidden);
。现在,为了知道jumble持有什么,您需要查看函数mystery3及其返回的值。它再次返回对内部函数mystery4的引用。现在有两个变量包含了对闭包mysterymystery3内部函数的引用。

现在让我们来看看var result = jumble(2)。执行jumble(2)是对jumble持有引用的函数(即mystery4的实际函数调用。当mystery4运行时,您会看到它需要一个参数bonus,它是var result = jumble(2)行给出的2。返回param(6) + bonusbonus2,好的,但是什么是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)。如果你还记得我们的bonus2的话,120+2=122瞧!

我觉得我没能很好地解释这个问题,但这可能是我能做的最好的。希望有帮助!