[英]Javascript: named closure and memory management
我试图了解有关JS中的内存管理的更多信息,而我对闭包有一些疑问。
情况1 :
// Suppose that object var is capable to emit events
var object = new EventEmitter();
object.addEventListener('custom-event', function callback(event) {
object.removeEventListener('custom-event', callback);
object = null;
//Do some heavy computation like opening a specific view or somehthing similar
var heavy_window = new HeavyWindow();
heavy_window.open();
});
情况2 :
// Suppose that object var is capable to emit events
var object = new EventEmitter();
object.addEventListener('custom-event', callback = function(event) {
object.removeEventListener('custom-event', callback);
object = null;
//Do some heavy computation like opening a specific view or somehthing similar
});
我的问题是:
情况1:
object
一直保留在内存中,直到heavy_window
没有为空是正确的吗? object
var清空可以帮助gc吗? 情况2:
...addEventListener(callback = function() {})
而不是...addEventListener(function callback() {})
会导致内存泄漏吗? 声明callback = function() {}
是否会导致全局隐藏变量? 注意,我不需要jQuery或其他框架的示例。 我有兴趣进一步了解JavaScript Vanilla。
先感谢您。
我认为ES规范中没有指定垃圾收集的详细信息。 但是,在大多数解释器中,一旦不存在对对象的任何引用或无法访问或在以后计划该对象,通常将对其进行垃圾回收。
在情况1中,如果将事件对象传递给HeavyWindow
,那么heavy_window
可能可以访问原始的new EventEmitter
( event
通常具有对事件目标的引用),因此,直到对您的所有引用进行引用之后,您的new EventEmitter()
才可能被垃圾回收。 heavy_window
不见了。 如果没有,那么您的new EventEmitter
将在将来的某个时刻被垃圾回收。
在情况2中,将回调函数分配给全局变量callback
不会发生任何变化,因为回调函数没有对您创建的实际new EventEmitter
对象的引用。 (同样,除非event
引用了您创建的new EventEmitter
对象。)
实际上,情况可能有所不同,因为浏览器中的垃圾收集器相当复杂。 解释器在什么时候决定收集垃圾确实由其决定,但最重要的是,只有在对一个对象的所有引用都消失时,它才会这样做。
内存管理通常并不是JavaScript真正关心的问题,您不必在大多数时间都在考虑它。 如果存在内存泄漏并且可以使用浏览器提供的开发人员工具检测到它,您将知道它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.