我遇到了以下问题:
function Parent(value) {
var callback = function() {
console.log(value);
//actually the following line was found in the code
var value; //<- hoisting, takes effect first
}
callback();
}
Parent(); //undefined
Parent('Wow!'); //undefined, closure value was lost?!
两个家长调用记录的'未定义'消息,但我真的希望看到'哇!'第二次通话的价值。
问题可在此处转载:http://jsfiddle.net/5tgsj37e/3/
答案 0 :(得分:2)
在此示例中,Parent
没有return语句,因此始终返回undefined
。 Parent
本身也不会调用console.log
,因此不会将任何内容记录到控制台。在其中创建并分配给var callback
的匿名函数调用console.log
。然后通过jQuery.ajax()
函数将其作为成功回调传递给ajaxCall
。
异步ajax请求成功后,将调用匿名callback
函数。根据{{3}}的ajax请求,当然是成功的。
由于结果似乎无法按原样重现,因此您的Parent
函数中可能会有其他代码删除value
参数或以其他方式将其设置为undefined
。由内部函数关闭的参数和变量不会被垃圾收集,除非它们具有0
引用计数。
答案 1 :(得分:0)
原因是吊装:
(function Parent(value) {
var child = function() {
console.log(value);
var value; //hoisting clears closure value
}
child();
}('Wow!'));
虽然没事:
(function Parent(value) {
var child = function() {
console.log(value);
//var value;
}
child();
}('Wow!'));
我昨天在Parent函数中没有注意到 var value 。
代码示例:http://jsfiddle.net/5tgsj37e/3/
有关代码风格的其他说明。
严格模式:将子项置于父项之外将创建全局项。因此&#34;使用严格&#34;在使用闭包时,严格模式应被视为一种好习惯。
显式闭包声明如果要在子函数中使用闭包值,最好将Child明确地包装到闭包中。如果您的孩子有一天开始在父母之外生活,这将阻止全局变量的创建。这也会引发一个没有价值的错误。
(function Parent(value) {
(function(childValue) {
var child = function() {
console.log(childValue);
}
child();
)(value));
}('Wow!'));
关于闭包的注意事项:每次函数调用都会创建闭包,而不是按函数声明创建。