Javascript: удаление отображаемых объектов без ссылок с помощью jQuery.remove ()

0

У меня есть объекты, которые только ссылки являются элементами DOM, к которым они привязаны, и я не уверен, что если вызов $element.remove() фактически удаляет ссылку или только элемент DOM. Вот пример кода.

var Foo = function() {
    var constructor = function Foo() {
        var col = '#'+(Math.random()*0xFFFFFF<<0).toString(16);
        var $container = $('<div class="element" style="background-color:'+col+';"></div>');
        var $remove = $('<input type="button" value="Delete" />');
        $container.append($remove);
        $('#wrapper').append($container);

        $remove.on('click', function() {
            $container.remove();
        });
    };
    return constructor;
}();

$('#addElement').on('click', function() {
    new Foo();
});

И jsfiddle для людей, с которыми можно поиграть. Нажмите одну кнопку, чтобы добавить элементы, щелкните каждый элемент "Удалить", чтобы удалить его; от DOM по крайней мере.

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

Если это не так, есть ли способ удалить объекты, не удерживая их в каком-то массиве?


EDIT: Хорошо, поэтому я как-то ответил на свой вопрос, используя снимки хром-кучи и добавив 10000 элементов на страницу. Вот важные данные. (Я включил HTMLInputElements, потому что большинство из того, что я вставляю, это)

                Initial         10,000          Removed
Memory          2.7MB           135MB           4.0MB
Objects         1,676           81,693          11,703
InputElements   1               59,995          1

Так что, кажется, сборщик мусора достаточно умен, чтобы удалить объекты, когда элемент DOM, ссылающийся на них, удаляется. Хотя это не идеально.

  • 0
    Посмотрите документы, особенно разница между detach и remove ( api.jquery.com/detach , api.jquery.com/remove ). В конце концов, ваш элемент все еще здесь, после того как вы удалили его из DOM - вы можете добавить его снова ( $container.appendTo('body'); ). При remove вы просто потеряли все данные и события, связанные с ним. Если вы действительно хотите полностью избавиться от этого, вы можете сделать $container = null; после удаления из DOM.
  • 0
    Я не просто хочу избавиться от $container а от экземпляра Foo.
Теги:
garbage-collection

1 ответ

0
Лучший ответ

Объекты будут собирать мусор, как только вы больше не будете ссылаться на объект. Я не уверен, что это будет считаться "лучшей практикой" для этого. Из MDN:

С другой стороны, значения JavaScript выделяются, когда вещи (объекты, строки и т.д.) Создаются и "автоматически" освобождаются, когда они больше не используются.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

"Автоматически", описанный выше в современных браузерах, означает, что объекты, которые считаются "недоступными", будут помечены для сбора мусора.

Вызов $.element.remove() приведет к удалению только элемента DOM, поскольку он знает только об элементе DOM. Невозможно, чтобы он мог удалить любой другой объект, связанный с элементом DOM, потому что он не знает об этом объекте.

http://api.jquery.com/remove/

  • 0
    Но поймет ли сборщик мусора, что объект можно собрать?
  • 0
    Да, потому что сборщик мусора ищет «недоступные объекты» или объекты, на которые нет ссылок. И в этот момент у вас не будет ссылки на объект, и сборщик мусора удалит его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню