请解释这个Javascript闭包练习
Please explain this Javascript closure exercise
我是一个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
的引用。现在,您拥有的两个变量包含对闭包mystery
和mystery3
的内部函数的引用。
现在让我们来看看var result = jumble(2)
。执行jumble(2)
是对jumble
拥有引用的函数(即mystery4
)的实际函数调用。当mystery4
运行时,您可以看到它需要一个参数bonus
,该参数将是var result = jumble(2)
行中给定的2
。返回param(6) + bonus
。bonus
是2
,好吧,但什么是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
,即我们的mystery2
0。在执行mystery2
结束时,我们有一个值120
,它在mystery4
中返回给我们的param(6)
。如果你还记得我们的bonus
是2
,120+2=122
,哇!
我觉得我没有很好地简单地解释这一点,但这可能是我能做的最好的事情。希望这能有所帮助!
- 在underscorejs模板中使用闭包
- setTimeout可以与闭包内的函数一起使用吗
- 附加到原型属性的Do函数没有闭包
- 使用闭包共享构造函数参数
- 使用Google闭包编译器包含一个Ecmascript 6类
- 从js引擎的角度来看闭包和构造函数是如何工作的
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- 子类访问父类's闭包变量
- 闭包如何具体化数据封装
- Javascript.闭包和dynamic'这'实际上具有约束力
- 构造函数函数闭包变量
- 闭包js框架-将ArrayBuffer转换为字符串
- 如何在Angularjs中重构闭包中的重复代码
- 如何告诉闭包javascript编译器不要混淆webkitAudioContext的方法名称
- Google闭包和生成的getters/ssetter
- 如何冻结函数's在闭包中的变量
- 如何使用外部Javascript库(如jQuery)重命名Google闭包样式表
- 使变量可用于不带闭包的异步调用
- 请解释这个Javascript闭包练习