Какого рода утечки памяти следует отслеживать с помощью данных jQuery ()? - PullRequest
7 голосов
/ 29 июня 2009

Должен ли я связывать каждый вызов data () с последующим вызовом removeData ()?

Мои предположения: jQuery's remove () удалит элементы из DOM, и если у меня нет других ссылок для удаления, мне больше не нужно выполнять очистку.

Однако, если у меня есть какой-нибудь javascript var или объект, относящийся к одному из удаляемых элементов, мне нужно будет это почистить, и я предполагаю, что относится и к функции данных jQuery, потому что это как-то ссылается на элементы.

Так что, если мне нужно вызвать removeData перед удалением, есть ли ярлык для удаления всех данных, связанных с элементом, или мне нужно вызывать каждый явно по имени?

Редактировать: Я просмотрел исходный код и подтвердил, что сказал Боргар и петухи. Remove удаляет элементы из dom и удаляет любые события и данные, хранящиеся в них, - это удобно, но заставляет задуматься, когда вы будете использовать removeData (). Вероятно, не часто.

Ответы [ 3 ]

14 голосов
/ 29 июня 2009

Данные jQuery не сохраняют ссылку на элемент , поэтому не нужно беспокоиться об утечках памяти. Его цель - решить именно эту проблему.

Небольшое упрощение того, как это работает:

Элемент id добавляется к каждому «затронутому» узлу DOM. Все последующие действия, связанные с этим элементом DOM, используют этот идентификатор.

var theNode = document.getElementById('examplenode');
theNode[ 'jQuery' + timestamp ] = someInternalNodeID;

Вы можете получить доступ к идентификатору, используя ту же функцию, которую использует jQuery:

someInternalID = jQuery.data( document.body );

Когда вы добавляете данные к узлу, они сохраняются в объекте jQuery, хранящемся под внутренним идентификатором узла. Ваш $(element).data(key,value) переводит внутренне что-то вроде:

jQuery.cache[ someInternalNodeID ][ theKey ] = theValue;

Все входит в одну структуру, включая обработчики событий:

jQuery.cache[ someInternalNodeID ][ 'events' ][ 'click' ] = theHandler;

Когда элемент удаляется, jQuery может выбросить все данные (и обработчики событий) с помощью одной простой операции:

delete jQuery.cache[ someInternalNodeID ];

Теоретически, вы также можете удалить jQuery без утечек из любых ссылок. jQuery даже поддерживает несколько отдельных экземпляров библиотеки, каждый из которых содержит свой собственный набор данных или событий.

Вы можете увидеть, как Джон Резиг объясняет это в презентации "DOM Is Mess" .

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

Смысл jQuery в том, чтобы абстрагироваться от дрянных реализаций JavaScript и ошибок в браузерах, таких как утечки памяти:)

.. Да; все связанные с элементом данные будут удалены при удалении этого элемента из DOM.

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

В целом, javascript достаточно хорош, чтобы знать, когда уместно собирать мусор, и если вы не пишете очень масштабные или долго работающие клиентские приложения, я бы сказал, что задействованная память в основном несущественна и пытаться догадаться, что это не принесет вам много пользы.

Определение того, какие незаконченные лексические замыкания или другие хитрые javascript в jQuery все еще могут обращаться к вашим данным, может быть довольно сложным в некоторых случаях.

Насколько я знаю, однако, если вы сохраните ссылку на все, что вы получили с помощью функции данных jQuery, то будет продолжать существовать после удаления элемента, поэтому удаление этой ссылки будет также необходимо. Некоторые простые тестовые примеры дадут вам более определенный ответ.

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