Утечка: объект всё ещё нужен по графу
Завершение работы сцены не делает её listener недостижимым автоматически.
Игрок закрыл сцену, но глобальный event target всё ещё хранит callback, который использует её данные. Для разработчика сцена «закончилась». Для сборщика она остаётся достижимой.
function mount(scene) {
const onResize = () => scene.resize();
window.addEventListener('resize', onResize);
return () => window.removeEventListener('resize', onResize);
}
mount(scene) возвращает функцию очистки. Когда сцена больше не нужна, эту функцию нужно вызвать: она удалит обработчик onResize из window. В removeEventListener нужно передать тот же обработчик, который был добавлен.
Для поиска утечки в приложении можно сравнить снимки памяти после нескольких открытий и закрытий сцены и проверить, что продолжает её удерживать.