Может ли jQuery.data вызвать утечку памяти?

Будет ли следующий фрагмент кода создавать утечку памяти.

Согласно документации jQuery использование функции data позволяет избежать утечек памяти. Было бы полезно подтвердить, безопасно ли следующее.

var MyClass = function(el) {
    // Store reference of element in object.
    this.element = $(el);
};

// Store reference of object in element.
$('#something').data('obj', new MyClass('#something'));

Ответ 1

Очевидно, что код в нем будет занимать дополнительную память, если элемент DOM все еще подключен к DOM. Но я предполагаю, что вы спрашиваете, будет ли он продолжать использовать дополнительную память после того, как элемент DOM больше не будет использоваться.

Обновление: благодаря ответу Джо (который он с тех пор удалил), я потратил некоторое время на чтение утечек памяти в javascript, и, как представляется, мои предположения в приведенном ниже параграфе неверны. Поскольку элементы DOM не используют чистую сборку мусора, такая циклическая ссылка, как это, обычно предотвращает освобождение как элемента DOM, так и объекта javascript. Тем не менее, я считаю, что оставшаяся часть этого ответа по-прежнему верна.

Без глубокого знания того, как механизмы javascript реализуют сборку мусора, я не могу говорить авторитетно по этой теме. Однако мое общее понимание сборки мусора заставляет меня думать, что ваш код будет "безопасным" в том смысле, что после того, как элемент #something будет удален из DOM, результирующий объект MyClass будет иметь только ссылку на объект, который не имеет других связей. Алгоритмы графа сборщика мусора должны иметь возможность идентифицировать, что элемент DOM и его объект MyClass "плавают в пространстве" и не связаны со всем остальным.

Кроме того, jQuery не использует свои возможности для разделения данных и событий, связанных с данным элементом DOM, когда он удаляется из DOM. Из документации:

jQuery гарантирует, что данные удаляются, когда элементы DOM удаляются с помощью методов jQuery и когда пользователь покидает страницу.

Итак, предполагая, что вы последовательно используете jQuery, у вас будет только односторонняя ссылка, как только объект будет удален из DOM в любом случае, что делает его намного проще, чтобы сборщик мусора мог его узнать может избавиться от этих объектов.

Итак, если у вас нет чего-то другого, ссылающегося на объект MyClass после удаления элемента DOM, у вас не должно быть утечки памяти.

Ответ 2

Я полагаю, это зависит от механизма Javascritp.

У вас есть вопрос достаточно точно, чтобы выполнить тест. Я добавил длинную строку в объект и запускал потенциальную утечку в большом цикле.

В результате я не думаю об утечках в IE8 и в Chrome.

Но я не смог воспроизвести эти шаблоны просачивания.

Ответ 3

Это может привести к утечке памяти. теория метода jQuery.data может использовать внутренний класс данных Data для кэширования данных для элемента dom.

конечно, когда вы удаляете данные кэша, jQuery будет игнорировать данные. но внутренний кеш - это увеличивающийся массив, когда вы это сделаете, это будет продолжаться.

поэтому, в конце концов, будет очень большой массив кеша, который приведет к утечке памяти. В долгосрочном веб-приложении это может привести к утечке памяти.

Ответ 4

Атрибут данных хранит только строковые значения.