我的情况是这样的,我在本地范围内创建了类的实例,这个实例在构造期间分配了一个具有绑定(bind)上下文的方法作为事件处理程序。
最小示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Minimal</title>
<meta name="description" content="The HTML5 Herald">
<meta name="author" content="SitePoint">
</head>
<body>
<a>Hello</a>
<button>Click</button>
<script text="javascript">
(function()
{
class App
{
constructor()
{
let anchor = document.getElementsByTagName(`a`)[0];
let anchorHandler = this.sayClicked.bind(this);
anchor.addEventListener(`click`, anchorHandler, false);
}
sayClicked()
{
alert(`Clicked`);
}
}
new App();
})();
</script>
</body>
</html>
我知道在 IIFE 执行后,仅引用 App 实例是具有绑定(bind)上下文的事件处理程序。到目前为止,Chrome 内存选项卡向我展示了很好的
我的问题是,删除 anchor 元素后(删除是通过控制台实现的,控制台被删除),Chrome 内存仍然在内存中显示 App 实例。我不明白,我相信唯一的引用是事件处理程序,根据 this事件处理程序也应该被删除,这意味着只对 App 实例的引用也应该被删除,所以我期望垃圾收集。在堆快照之前我强制进行了垃圾回收,但是 App 实例仍然存在
在 native_bind() 中绑定(bind) _this 旁边是窗口图标,Chrome 告诉我可以从窗口访问它。我尝试检查窗口,但无法访问 App 实例。
最佳答案
通过控制台删除 anchor 和直接通过您的站点删除 anchor 是有区别的。如果您通过文档删除元素,则该应用程序将不再存在于内存中。 Try this
关于javascript - 实例未被垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59903188/