我偶然发现了以下问题:
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/
相关问题:为什么这个闭包作用域变量会失去它的值?
发布于 2015-10-20 19:56:02
原因是吊装:
(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!'));昨天我没有注意到父函数中的var值。
代码示例:http://jsfiddle.net/5tgsj37e/3/
关于代码样式的附加注释。
严格模式:将子对象置于父级之外的将创建一个全局模式。因此,在使用闭包时,“使用严格”的严格模式应该被视为一种良好的实践。
显式闭包声明如果要在子函数中使用闭包值,最好将子函数显式包装为闭包。这将阻止全局变量的创建,如果有一天您的孩子开始生活在父变量之外。这也会引发一个没有值的错误。
(function Parent(value) {
(function(childValue) {
var child = function() {
console.log(childValue);
}
child();
)(value));
}('Wow!'));关于闭包的注释:闭包是在每个函数调用中创建的,而不是每个函数声明。
发布于 2015-10-19 23:08:32
在本例中,Parent没有返回语句,因此总是返回undefined。Parent本身也不会调用console.log,因此不会将任何内容记录到控制台。在其中创建并分配给var callback的匿名函数调用console.log。然后通过jQuery.ajax()函数将其作为一个成功的回调传递给ajaxCall。
异步ajax请求成功后将调用匿名callback函数。当然,根据jQuery文档对ajax的请求,这是成功的。
由于结果似乎不可能按原样与代码一起再现,所以您的Parent函数中可能会有其他代码删除value参数或以其他方式将其设置为undefined。被内部函数关闭的参数和变量不会被垃圾收集,除非它们有一个0引用计数。
https://stackoverflow.com/questions/33224375
复制相似问题