Почему функция.data() в jQuery лучше предотвращает утечки памяти?
Что касается утилиты jQuery jQuery.data(), в онлайн-документации сказано:
"Метод jQuery.data() позволяет нам присоединять данные любого типа к элементам DOM способом, который защищен от циклических ссылок и, следовательно, от утечек памяти".
Зачем использовать:
document.body.foo = 52;
может привести к утечке памяти - или в каких условиях - так что я должен использовать
jQuery.data(document.body, 'foo', 52);
Должен ли я ВСЕГДА отдавать предпочтение.data () вместо использования в любом случае расширений?
(Буду признателен, если вы сможете привести пример для сравнения различий)
Спасибо,
Бурак Оздоган
3 ответа
Лучше именно из-за того, что говорится в цитате, которую вы дали: "в безопасности от циклических ссылок".
Скажем, у вас есть переменные nodeOne
а также nodeTwo
, какие ссылочные узлы.
Скажем, вы поместили это в функцию (чью ссылку вы не храните):
jQuery.data(nodeOne, 'item', nodeTwo);
jQuery.data(nodetwo, 'item', nodeOne);
После запуска функции появляется циклическая ссылка: у nodeOne есть ссылка на nodeTwo, и наоборот.
Используя jQuery.data, эта циклическая ссылка не помешает сборке этих двух переменных.
Однако, если вы должны сделать то же самое, но без использования jQuery.data, nodeOne
а также nodeTwo
переменные не будут собираться мусором, даже если переменные больше не нужны.
-
Должен ли я ВСЕГДА отдавать предпочтение.data() вместо использования в любом случае расширений?
Если вы не настраиваете большие объемы данных и не нуждаетесь в каких-либо дополнительных падениях производительности (и вы могли бы определить это с помощью профилирования) и уверены, что не создадите циклические ссылки (или хотя бы число, которое будет иметь значение), тогда да, вы также можете использовать только jQuery.data.
Я уверен, что вы не можете ввести утечку памяти с примитивным значением, как 52
, Утечки памяти при расширении обычно происходят, когда применяется значение, которое содержит объект со ссылкой на элемент.
Я предлагаю ознакомиться с содержанием заголовка Циркулярной ссылки по адресу http://msdn.microsoft.com/en-us/library/Bb250448. Еще лучше, прочитайте все это:-)
При этом, я думаю, что большинство людей рекомендуют не использовать экспансию, если это возможно (и обычно это возможно). Использование jQuery data()
В любом случае, это хорошая альтернатива.
Просто понял, что я не ответил на твой вопрос, лол. JQuery-х
data()
предоставляет метод, который выглядит примерно так:- JQuery вычисляет уникальный идентификатор для данных
- Данные хранятся в объекте, доступном для
data()
метод, используя уникальный идентификатор - Свойство expando применяется к элементу с уникальным идентификатором в качестве примитивного значения.
Всякий раз, когда вы звоните data()
чтобы получить данные, jQuery обращается к свойству expando для уникального идентификатора и использует этот идентификатор для извлечения данных из объекта кэширования. Поскольку раскрытие содержит примитивное значение и не имеет привязки к объекту кэширования, циклические ссылки отсутствуют.
Немного отличного прочтения на эту тему: