【发布时间】:2018-02-17 01:03:16
【问题描述】:
我正在尝试更多地了解 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
});
我的问题是:
-
案例一:
- 认为
object保留在内存中直到heavy_window未被清空是正确的吗? - 将闭包内的
objectvar 清零可以帮助gc 吗?
- 认为
-
案例 2:
- 以这种方式命名闭包
...addEventListener(callback = function() {})而不是...addEventListener(function callback() {})会导致内存泄漏?声明callback = function() {}会导致全局隐藏变量?
- 以这种方式命名闭包
注意,我不需要 jQuery 中的示例或使用其他框架。我有兴趣了解更多关于 JavaScript vanilla 的信息。
提前谢谢你。
【问题讨论】:
-
关于案例一,你觉得
object和heavy_window有什么关系? -
@Bergi
heavy_window是在附加到object的侦听器中创建的,所以.. 直到heavy_window存在,object仍保留在内存中。我说的对吗? -
没有。侦听器函数可能附加到
object,但在调用期间创建的东西不是。当函数返回时,它们会超出范围,并且不会保留对它们的引用。除非您将它们显式存储在某个地方,或者可能从函数中return它们,以便调用者可以对它们做任何事情。
标签: javascript memory memory-management memory-leaks closures