Моя ситуация такова, я создал экземпляр класса в локальной области, этот экземпляр во время построения назначил один из методов с привязанным контекстом в качестве обработчика события.
Минимальный пример:
<!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 является обработчиком событий с привязанным контекстом. Пока все хорошо Chrome вкладка памяти показывает мне
Моя проблема, после удаления элемента привязки (удаление было осуществлено через консоль, консоль была стерта ), Chrome память все еще показывает мне экземпляр приложения в памяти. Я не понимаю, я считаю, что только ссылка была обработчиком событий, в соответствии с этот обработчик событий также должен быть удален, что означает, что должна быть удалена только ссылка на экземпляр приложения, поэтому я ожидал сбора мусора. До снимка кучи я принудительно собирал мусор, но экземпляр приложения все еще там
Рядом с привязан _this в native_bind () is window значок и Chrome говорит мне, что это доступно из окна. Я попытался проверить окно, но не смог добраться до экземпляра приложения.