首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么会丢失闭包值?

为什么会丢失闭包值?
EN

Stack Overflow用户
提问于 2015-10-19 21:37:56
回答 2查看 182关注 0票数 0

我偶然发现了以下问题:

代码语言:javascript
复制
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/

相关问题:为什么这个闭包作用域变量会失去它的值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-20 19:56:02

原因是吊装:

代码语言:javascript
复制
(function Parent(value) {
     var child = function() {
         console.log(value);
         var value; //hoisting clears closure value
     }
     child();
}('Wow!'));

虽然还可以:

代码语言:javascript
复制
(function Parent(value) {
     var child = function() {
         console.log(value);
         //var value;
     }
     child();
}('Wow!'));

昨天我没有注意到父函数中的var值。

代码示例:http://jsfiddle.net/5tgsj37e/3/

关于代码样式的附加注释。

严格模式:将子对象置于父级之外的将创建一个全局模式。因此,在使用闭包时,“使用严格”的严格模式应该被视为一种良好的实践。

显式闭包声明如果要在子函数中使用闭包值,最好将子函数显式包装为闭包。这将阻止全局变量的创建,如果有一天您的孩子开始生活在父变量之外。这也会引发一个没有值的错误。

代码语言:javascript
复制
(function Parent(value) {
     (function(childValue) {
         var child = function() {
            console.log(childValue);
         }
         child();
     )(value));
}('Wow!'));

关于闭包的注释:闭包是在每个函数调用中创建的,而不是每个函数声明。

票数 0
EN

Stack Overflow用户

发布于 2015-10-19 23:08:32

在本例中,Parent没有返回语句,因此总是返回undefinedParent本身也不会调用console.log,因此不会将任何内容记录到控制台。在其中创建并分配给var callback的匿名函数调用console.log。然后通过jQuery.ajax()函数将其作为一个成功的回调传递给ajaxCall

异步ajax请求成功后将调用匿名callback函数。当然,根据jQuery文档对ajax的请求,这是成功的。

由于结果似乎不可能按原样与代码一起再现,所以您的Parent函数中可能会有其他代码删除value参数或以其他方式将其设置为undefined。被内部函数关闭的参数和变量不会被垃圾收集,除非它们有一个0引用计数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33224375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档