Как 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;
}