Javascript 实例未被垃圾收集

Javascript 实例未被垃圾收集,javascript,memory-leaks,garbage-collection,google-chrome-devtools,Javascript,Memory Leaks,Garbage Collection,Google Chrome Devtools,我的情况是这样的,我在本地范围创建了类的实例,这个实例在构造时指定一个具有绑定上下文的方法作为事件处理程序 最小示例: <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Minimal</title> <meta name="description" content="The HTML5 Herald"&

我的情况是这样的,我在本地范围创建了类的实例,这个实例在构造时指定一个具有绑定上下文的方法作为事件处理程序

最小示例:

<!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>

最小的

我的问题是,在锚元素移除后(移除是通过控制台实现的,控制台被擦除),Chrome内存仍然在内存中显示我的应用程序实例。我不明白,我相信唯一的引用是eventhandler,根据eventhandler也应该被删除,这意味着只有对App实例的引用也应该被删除,所以我期望垃圾收集。在堆快照之前,我强制垃圾收集,但应用实例仍然存在


在绑定旁边,本机绑定()中的这个图标是窗口图标,Chrome告诉我可以从窗口访问它。我试图检查窗口,但无法访问应用程序实例。

通过控制台删除锚和直接通过站点删除锚是有区别的。如果通过文档删除元素,则应用程序将不再位于内存中。

这可能与函数
bind
creates..的副本有关?可能是的,但我找不到任何有关此类行为的信息。只是说,函数副本是一个奇特的对象。我怀疑你能否找到这个问题的确切答案,除非它以某种方式越过了一个专门从事垃圾收集工作的V8开发人员的办公桌,但我的估计是,这与V8保留事件侦听器的方式有关,以使开发人员能够观察到它们。一般来说,除了少数例外,您不应该能够看到它们,但是您会注意到,即使删除元素,您仍然可以在控制台中看到事件侦听器。更多信息:@zfrisch谢谢你的评论,有道理,但对我来说,这个功能可能会导致内存泄漏。