好吧,我正在凝视着学习闭包是如何工作的……而我被困在这个容器上已经有几个小时了。我只是不明白它是如何工作的。
我必须找到变量结果的最终值。
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;
}
答案是122,但我不确定该数字如何。
我计算出的答案是362。这显然是错误的。
我有362这样的
var hidden = mystery(3);
var jumble = mystery3(hidden);
var result = jumble(2);
function mystery ( input ){ //used 3 as an input
var secret = 4;
input+=2;
function mystery2 ( multiplier ) { //used 3 as multiplier
multiplier *= input; // 3 * 5
return secret * multiplier;
}
return mystery2; //returned 60
}
function mystery3 ( param ){ //used 60 as param
function mystery4 ( bonus ){ //used 2 as bonus
return param(6) + bonus; //60(6) + 2
}
return mystery4; // answer is 362
}
有人可以告诉我您到底能得到多少答案122吗?
最佳答案
简单来说,闭包意味着超出范围的局部变量的值将保留在函数内部。
让我们逐步看一下您的代码:
var hidden = mystery(3);
现在,
mystery
返回一个函数。但是它实际上返回了什么。一个简单的alert(hidden)
语句将告诉您它返回,function mystery2( multiplier ) {
multiplier *= input;
return secret * multiplier;
}
现在,如果您查看此函数的局部变量的值,
multiplier
是一个参数,它的值将是调用它时传递给它的值但是
input
的值是什么?和
secret
?这就是关闭起作用的地方。输入值将取自创建此函数的作用域。创建此函数时,
input
和secret
的值是什么?让我们再次看一下mystery
:function mystery ( input ){ // value 3 is passed here as a parameter
var secret = 4;
input+=2;
...
}
因此,我们发现
input
实际上具有值5
,而secret
具有值4
。现在,返回的函数基本上等效于:function mystery2( multiplier ) {
multiplier *= 5;
return 4 * multiplier;
// for future use, let's say that above statement is equivalent to:
// return 4 * (multiplier * 5); ----- (1)
// (now be a good boy/girl and don't scroll down to end)
}
好,接下来:
var jumble = mystery3(hidden);
同样,
mystery3
返回一个函数。 alert(jumble)
为此:function mystery4( bonus ){
return param(6) + bonus;
}
再一次,以与以前相同的方式思考,我们可以说这等同于:
function mystery4( bonus ){
return mystery2(6) + bonus; // param <- hidden <- mistery2
} // ----- (2)
最后,
var result = jumble(2);
等效于:
var result = mystery4(2);
那是,
var result = mystery2(6) + 2; // because (2), see above
那是
var result = 4 * (6 * 5) + 2; // because (1), see above
ew ...
122
关于javascript - 有人可以解释一下此javascript闭包的工作原理吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24856862/