2016-12-10 1 views
2

Мне интересно, какие ограничения могут быть собраны в мусорную корзину Javascript, и может ли это быть сработано с помощью саморекламы.Функция самореференции, элемент DOM и сборщик мусора Javascript

Представьте, что раздел прикреплен к документу. Теперь давайте добавим пользовательский атрибут к нему: функция для работы на указанный элемент:

(function(){ 
    var el = document.getElementById('mydiv'); 
    el.custom_func = function() { 
     el.style.color = 'green'; 
    }; 
})(); 

Наконец, мы потом удалить элемент из DOM.

var el = document.getElementById('mydiv'); 
el.parentNode.removeChild(el); 
el = null; 

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

Есть ли какой-либо метод, в котором пользовательский атрибут элемента DOM может испортить сборку мусора?

+1

Назад в день это была проблема в Internet Explorer. Я сомневаюсь, что сейчас стоит беспокоиться. Однако я могу ошибаться. – Pointy

ответ

0

Предполагая, что нет других ссылок на этот элемент, будет ли он получать сборку обычного мусора?

Да.

Есть ли способ, которым пользовательский атрибут элемента DOM может испортить сборку мусора?

Суть сбора мусора: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management#Limitation_objects_need_to_be_made_explicitly_unreachable

var green = 'green'; 
(function(){ 
    var el = document.getElementById('mydiv'); 
    el.custom_func = function() { 
     el.style.color = green; 
    }; 
})(); 

В этом примере элемент DOM будет сборке мусора. Переменная green не предотвратит сбор мусора на элементе.

var colors = { 
    green: 'green'; 
}; 

(function(){ 
    var el = document.getElementById('mydiv'); 
    el.availableColors = myColors; 
    el.custom_func = function() { 
     el.style.color = el.availableColors.myColors.green; 
    }; 
})(); 

Даже в этом случае 2-й элемент будет мусора, потому что это имеет место только указатель на colors объекта.

Подробнее о сборке мусора здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management