首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾回收关闭?

垃圾回收关闭?
EN

Stack Overflow用户
提问于 2015-01-08 14:07:50
回答 1查看 35关注 0票数 1

大家好,各位程序员!

我的整个代码基于以下结构:

函数pseudoClass() { var privateVar = 0;返回{ incrementVar: function() {privateVar += 1;};},getPrivateVar: function() {返回privateVar;} } test1 = pseudoClass();

我想保护"privateVar“,同时能够操纵它。"pseudoClass“一次只实例化一次。我认为“测试”涉及到一个终结。当我完成了“测试”之后,我可能会在稍后创建"test2“来重新开始(privateVar又被设置为0)。我不感兴趣的只是将“测试”重新设置为0。

现在,这是一个问题。当不再使用"test“时,闭包会发生什么情况?是垃圾收集的,还是会导致内存泄漏?若否,又会在甚麽情况下这样做?我希望我的问题足够清楚,我对这件事很陌生。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-01-08 14:22:40

有一种常见的误解,即闭包本身就会导致内存泄漏。它们不会--只要它们成为遥不可及,它们就可以像任何其他对象一样被垃圾收集。当它们被泄漏时,它们往往会导致问题,因为它们阻止了它们继承的父作用域被垃圾收集。这可以为闭包提供一个非常大的保留尺寸

在您的示例中,当没有其他引用时,pseudoClass返回的对象及其方法关闭的范围(包含privateVar)成为GC的条件:

代码语言:javascript
复制
var test1 = pseudoClass();
test1 = null;

// The object, closures and privateVar can be garbage collected

如果对pseuedoClass返回的对象或包含函数作用域的任何闭包有另一个引用,则不能垃圾收集对象和作用域。此模式是内存泄漏的常见原因。

代码语言:javascript
复制
var test1 = pseudoClass();
var leak = test1.incrementVar
test1 = null;

// Nothing can be garbage collected, since `incrementVar` needs to retain its parent scope
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27842044

复制
相关文章

相似问题

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