我是一个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;
}
答案 0 :(得分:13)
为了理解这一点,你必须知道函数调用和函数引用之间的区别。以及范围在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
,该行2
将从行var result = jumble(2)
中提供param(6) + bonus
。它返回bonus
。 2
是param(6)
,好的,但jumble
是什么?这是hidden
:mystery2
的值,它是对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
。如果你还记得我们的2
是120+2=122
,{{1}}瞧!
我觉得我没有很好地解释这个问题,但这可能是我能做的最好的事情。希望有所帮助!