请解释这个Javascript关闭练习

时间:2013-12-07 19:33:59

标签: javascript closures

我是一个javascript noob试图围绕下面的关闭练习。

现在,我知道结果是122.任何人都可以一步一步地指导我(传递给什么),所以我可以理解闭包是如何工作的?

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

1 个答案:

答案 0 :(得分:13)

为了理解这一点,你必须知道函数调用和函数引用之间的区别。以及范围在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,该行2将从行var result = jumble(2)中提供param(6) + bonus。它返回bonus2param(6),好的,但jumble是什么?这是hiddenmystery2的值,它是对param(6)的引用,还记得吗?因此,运行mystery2将使用参数6

执行var result = jumble(2)

因此,追溯这些函数可能会让人感到有些困惑,但让我们按照实际值来说明这一点,以使它更清晰一些(如果这甚至是一个词)。

执行param(6) + 2会给我们一个param(6)的返回值,以便mystery2通过multiplier = 6进入multiplier = 6 * input,我们设置3+2=5 }。我们的输入等于multiplier,因此6*5=30变为4,作为返回值,我们将var secret乘以mystery2。在120执行结束时,我们的值为param(6),并返回mystery4中的bonus。如果你还记得我们的2120+2=122,{{1}}瞧!

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