За какими утечками памяти я должен наблюдать с данными jQuery ()?

Мое противоречивое мнение, вероятно, заключается в том, что Джон Кармак (ID Software, Quake и т. Д.) Не очень хороший программист.

Не поймите меня неправильно, по моему мнению, он умный программист, но после того, как я заметил строку «#define private public» в исходном коде Quake, я не мог не помочь думаю, что он парень, который выполняет свою работу, неважно, что, но, по моему определению, не хороший программист :) Это мнение вызвало у меня много горячих дискуссий;)

7
задан Keith Bentrup 29 June 2009 в 06:30
поделиться

3 ответа

Данные 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 a MESS» .

14
ответ дан 6 December 2019 в 12:53
поделиться

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

.. Ага; все данные, связанные с элементом, будут удалены, когда этот элемент будет удален из DOM.

2
ответ дан 6 December 2019 в 12:53
поделиться

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

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

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

0
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: