Почему функция .data () в jQuery лучше предотвращает утечки памяти? - PullRequest
7 голосов
/ 30 апреля 2010

Относительно утилиты jQuery jQuery.data () в онлайн документации написано:

"Метод jQuery.data () позволяет нам прикрепить данные любого типа к DOM элементы таким образом, что это безопасно от круговые ссылки и, следовательно, из утечки памяти. «

Зачем использовать:

document.body.foo = 52; 

может привести к утечке памяти - или при каких условиях - так что я должен использовать

jQuery.data(document.body, 'foo', 52);

Должен ли я ВСЕГДА отдавать предпочтение .data () вместо использования в любом случае расширений?

(Буду признателен, если вы приведете пример для сравнения различий)

Спасибо

Бурак Оздоган

Ответы [ 3 ]

7 голосов
/ 30 апреля 2010

Лучше именно из-за того, что говорится в цитате, которую вы дали: "безопасно от циклических ссылок".

Скажем, у вас есть переменные nodeOne и nodeTwo, которые ссылаютсяnode.

Допустим, вы поместили это в функцию (чью ссылку вы не сохраните):

jQuery.data(nodeOne, 'item', nodeTwo);
jQuery.data(nodetwo, 'item', nodeOne);

После запуска функции есть циклическая ссылка: для nodeOne есть ссылка наnodeTwo и наоборот.

Используя jQuery.data, эта циклическая ссылка не помешает сборке мусора для этих двух переменных.

Однако, если бы вы делали то же самое, но без с использованием jQuery.data переменные nodeOne и nodeTwo не будут собирать мусор, даже если переменные больше не нужны.

-

Должен ли я ВСЕГДА отдавать предпочтение .data () вместо использования в любом случае расширений?

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

5 голосов
/ 30 апреля 2010

Я почти уверен, что вы не можете создать утечку памяти с таким примитивным значением, как 52. Утечки памяти при расширении обычно происходят, когда применяется значение, которое содержит объект со ссылкой на элемент.

Я предлагаю прочитать содержание заголовка Циркулярного справочника по адресу http://msdn.microsoft.com/en-us/library/Bb250448. Еще лучше прочитать все это: -)

При этом, я думаю, что большинство людей рекомендуют не использовать эксплоши, если это возможно (и обычно это возможно). В любом случае, использование jQuery data() - хорошая альтернатива. <Ч /> Просто понял, что я не ответил на твой вопрос, лол. data() в jQuery предоставляет метод, который выглядит примерно так:

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

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

3 голосов
/ 30 апреля 2010

Отличное чтение по теме:

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

...