在这里,我需要一些帮助来了解它的工作原理(或就此而言无效)。
var classInstance
是实例,则可以像classInstance.rootNode
这样访问节点。 classInstance
保留在关闭状态,并将ajax响应传递给classInstance
,并使用它来修改rootNode
的样式或内容或其他内容。 我的问题是,一旦完成
classInstance
,假设没有其他引用它,并且它本身没有其他引用,那么垃圾收集器会丢弃它吗?如果没有,我该如何标记以进行处置? 最佳答案
为了回应@ Beetroot-Beetroot的疑问(我也承认也是),我做了一些进一步的研究。我设置了this fiddle,并使用chrome dev-tools' timeline和this article作为准则。在小提琴中,两个几乎相同的处理程序创建了一个带有2个日期对象的闭包。第一个仅引用a
,第二个同时引用a
和b
。尽管在这两种情况下都只能真正公开a
(硬编码值),但是第一个闭包使用的内存要少得多。无论是归因于JIC(及时编译)还是V8的JS优化向导,我不能肯定地说。但是从我的读物来看,我要说的是V8的GC在b
函数返回时取消分配tst
,而在第二种情况下则不能(在bar
返回时b
引用tst2
)。我感觉这并不是那么古怪,发现FF甚至IE都可以类似地工作,我一点也不感到惊讶。出于完整性考虑,只是添加了此更新(也许无关紧要),因为我感觉到Google的开发工具文档链接似乎是一种附加值。
作为一个简单的经验法则,它取决于:只要您不再引用classInstance
变量,就应该对其进行GC处理,而不管其自身的循环引用如何。我已经测试了很多构造,类似于您在此处描述的构造。也许it's worth a look我发现闭包和内存泄漏并不是那么普遍或容易实现(至少现在不再如此)。
但是正如公认的答案所言:几乎什么时候泄漏什么代码都是不可能的。再次阅读您的问题,我会说:不,您不会泄漏内存:classInstance
变量不是在全局范围内创建的,而是被传递给各种函数(因此也传递给各种范围的)。每次函数返回时,这些作用域就会分解。如果将classInstance
传递给另一个函数/作用域,则不会对其进行GC处理。但是,只要最后一个引用classInstance
的函数返回,该对象就会标记为GC。当然,它可能是一个循环引用,但是它是一个引用,只能从其自己的作用域中访问。您也不能真正称其为闭包:闭包是在某种形式的外部作用域暴露时发生的,在您的示例中没有发生这种情况。
我在解释像这样的东西时很垃圾,但只想回顾一下:
var foo = (function()
{
var a, b, c, d;
return function()
{
return a;
}
})();
GC将取消分配mem
b
,c
和d
引用:它们已超出范围,无法访问它们...var foo = (function()
{
var a, b, c, d;
return function()
{
a.getB = function()
{
return b;
}
a.getSelf = function()
{
return a;//or return this;
}
return a;
}
})();
//some code
foo = new Date();//
在这种情况下,出于明显的原因,
b
也不会得到GC处理。 foo
公开a
和b
,其中a
是包含循环引用的对象。尽管foo = new Date()
很快,但是foo
丢失了对a
的任何引用。当然,a
仍然引用自己,但是a
不再公开:它可以引用任何它喜欢的东西。大多数浏览器都不会在乎,并且会使用GC的a
和b
。实际上,我已经检查了Chrome,FF和IE8的所有GC上面的代码是否完美……然后,不用担心。