Экземпляр не мусор - PullRequest
       89

Экземпляр не мусор

3 голосов
/ 24 января 2020

Моя ситуация такова, я создал экземпляр класса в локальной области, этот экземпляр во время построения назначил один из методов с привязанным контекстом в качестве обработчика события.

Минимальный пример:

<!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 вкладка памяти показывает мне

enter image description here

Моя проблема, после удаления элемента привязки (удаление было осуществлено через консоль, консоль была стерта ), Chrome память все еще показывает мне экземпляр приложения в памяти. Я не понимаю, я считаю, что только ссылка была обработчиком событий, в соответствии с этот обработчик событий также должен быть удален, что означает, что должна быть удалена только ссылка на экземпляр приложения, поэтому я ожидал сбора мусора. До снимка кучи я принудительно собирал мусор, но экземпляр приложения все еще там

enter image description here

Рядом с привязан _this в native_bind () is window значок и Chrome говорит мне, что это доступно из окна. Я попытался проверить окно, но не смог добраться до экземпляра приложения.

1 Ответ

2 голосов
/ 25 января 2020

Разница между удалением якоря через консоль и через ваш сайт напрямую. Если вы удалите элемент через документ, приложение больше не будет в памяти. Попробуйте это

...