请解释这个Javascript闭包练习

36

我是一个JavaScript新手,试图理解下面的闭包练习。

现在,我知道结果是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;
}

你最好自己一步一步地尝试去做。如果你在某个过程的特定部分卡住了,那就是一个好问题。 - Pointy
感谢 @DSG 的帮助,Pointy。 - user2342953
1个回答

20
为了理解这个问题,你必须知道函数调用和对函数的引用之间的区别,以及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) + bonus。好吧,bonus2,但是param(6)是什么?那是给定给jumble的值:hidden,它是对mystery2的引用,还记得吗?所以运行param(6)将使用参数6执行mystery2

因此,追踪函数可能会有点令人困惑,但让我们通过实际值来跟进,以使其更清晰(如果这是一个词的话)。

执行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,它被返回到mystery4中的param(6)。如果您记得我们的bonus2120+2=122,完成!

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接