Данные jQuery не сохраняют ссылку на элемент , поэтому не нужно беспокоиться об утечках памяти. Его цель - решить именно эту проблему.
Небольшое упрощение того, как это работает:
Элемент id добавляется к каждому «затронутому» узлу DOM. Все последующие действия, связанные с этим элементом DOM, используют этот идентификатор.
var theNode = document.getElementById('examplenode');
theNode[ 'jQuery' + timestamp ] = someInternalNodeID;
Вы можете получить доступ к идентификатору, используя ту же функцию, которую использует jQuery:
someInternalID = jQuery.data( document.body );
Когда вы добавляете данные к узлу, они сохраняются в объекте jQuery, хранящемся под внутренним идентификатором узла. Ваш $(element).data(key,value)
переводит внутренне что-то вроде:
jQuery.cache[ someInternalNodeID ][ theKey ] = theValue;
Все входит в одну структуру, включая обработчики событий:
jQuery.cache[ someInternalNodeID ][ 'events' ][ 'click' ] = theHandler;
Когда элемент удаляется, jQuery может выбросить все данные (и обработчики событий) с помощью одной простой операции:
delete jQuery.cache[ someInternalNodeID ];
Теоретически, вы также можете удалить jQuery без утечек из любых ссылок. jQuery даже поддерживает несколько отдельных экземпляров библиотеки, каждый из которых содержит свой собственный набор данных или событий.
Вы можете увидеть, как Джон Резиг объясняет это в презентации "DOM Is Mess" .