Почему функция.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() предоставляет метод, который выглядит примерно так:

  1. JQuery вычисляет уникальный идентификатор для данных
  2. Данные хранятся в объекте, доступном для data() метод, используя уникальный идентификатор
  3. Свойство expando применяется к элементу с уникальным идентификатором в качестве примитивного значения.

Всякий раз, когда вы звоните data() чтобы получить данные, jQuery обращается к свойству expando для уникального идентификатора и использует этот идентификатор для извлечения данных из объекта кэширования. Поскольку раскрытие содержит примитивное значение и не имеет привязки к объекту кэширования, циклические ссылки отсутствуют.

Немного отличного прочтения на эту тему:

Шаблоны утечки памяти в JavaScript

Другие вопросы по тегам