请解释这个Javascript闭包练习

Please explain this Javascript closure exercise

本文关键字:闭包 练习 Javascript 解释      更新时间:2024-05-02

我是一个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;
}

为了理解这一点,您必须知道函数调用和对函数的引用之间的区别。以及作用域在javascript中的工作方式。

假设你确实知道这些事情,让我们开始解释。

因此,您首先有一个变量hidden,它被分配了一个值mystery(3)。因此,立即查看函数mystery,看看它返回了什么。它向内部函数CCD_ 4返回引用。所以现在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,即我们的mystery20。在执行mystery2结束时,我们有一个值120,它在mystery4中返回给我们的param(6)。如果你还记得我们的bonus2120+2=122,哇!

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