Закрытие JavaScript и утечки памяти - PullRequest
4 голосов
/ 05 июня 2009

Я прочитал в Jquery в действии, что утечки памяти могут быть результатом закрытия javascript.

"Непреднамеренные замыкания могут иметь непредвиденные последствия. Например, циклические ссылки могут привести к утечкам памяти. Классическим примером этого является создание элементов DOM, которые ссылаются на переменные замыкания, предотвращая их восстановление." *

Кто-нибудь может привести пример?

спасибо!

Ответы [ 2 ]

2 голосов
/ 05 июня 2009

Здесь onClick имеет закрытие, которое сохраняет ссылку на element. Присваивая onClick element.click, создается круг: element -> onClick -> element -> onClick ...

function addClickHandler(element) {
    element.click = function onClick(e) {
        alert("Clicked the " + element.nodeName)
    }
}

В некоторых (большинство? Конечно, не всех ) движках javascript сборщик мусора не будет собирать объект, который имеет хотя бы одну ссылку на него. Даже если из DOM будет удален element, круговая самоссылка, указанная выше, не позволит собрать element и onClick, что приведет к утечке памяти.

0 голосов
/ 05 июня 2009

Особая проблема - обработчики событий в IE. По сути, если вы создаете обработчик событий, который захватывает узел, к которому он присоединен, внутри своей цепочки областей действия, то IE никогда не будет собирать ни один из них. Это ошибка в IE из-за использования пересчета, а не чистого GC для жизнеспособности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...