Как jQuery хранит данные с .data()?

Я немного запутался в том, как jQuery хранит данные с функциями .data().

Это что-то называется expando? Или это использование HTML5 Web Storage, хотя я думаю, что это очень маловероятно?

В документации написано:

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

Как я читал о expando, у него, похоже, есть риск утечки памяти. К сожалению, моих навыков недостаточно для чтения и понимания самого кода jQuery, но я хочу знать, как jQuery хранит такие данные с помощью data().

Ответы

Ответ 1

В основном jQuery хранит информацию, которую вы храните/извлекаете с помощью data(name, value)/data(name) и удаляете с помощью removeData(name) во внутреннем javascript-объекте с именем cache. Остальное - это просто магия javascript, чтобы заставить ее работать и поддерживать все ассоциации правильно.

О, и ответить на первую часть вашего вопроса. Также это не expando и HTML5 WebStorage.

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

"jQuery" + now() //e.g. jQuery1268647073375

кстати. now() - это внутренняя функция, которая возвращает (new Date).getTime()

и значение UUID, сгенерированное jQuery.

Таким образом, jQuery позже может извлечь правильные данные из внутреннего кеша.

Итак, если вы беспокоитесь о expando в IE, где я помню, вы не можете их удалить, тогда утечка должна быть минимальной, поскольку jQuery использует только 1 расширение на элемент, на котором хранятся данные. Если вы не назовете data() буквально 1000 элементов, я не вижу проблем с памятью.

Ответ 2

Функция data в jQuery.fn.extend использует этот оператор для сохранения предоставленной переменной:

jQuery.cache[ id ][ name ] = data;

jQuery.cache - это просто стандартный объект, определенный как cache: {}, внутри пространства имен jQuery.

Итак, отвечая на ваш вопрос - я верю, что jQuery хранит данные в стандартном внутреннем JavaScript-объекте под названием cache.

О, и в отношении вашего вопроса о утечке памяти - я действительно не знаю. Если у JavaScript есть некоторые проблемы, хранящие ссылки на элементы DOM в стандартном объекте JS, это может быть проблемой.

Ответ 3

Также проверьте плагин метаданных - он извлекает метаданные из элемента DOM и возвращает его как объект (обсуждается в комментариях здесь).

Ответ 4

Его класть в кеш браузером локально так же, как файл cookie

      from jquery uncompressed:

 if ( data !== undefined ) {
            thisCache[ name ] = data;
        }