Я предпочитаю, чтобы прослушиватели событий были развернуты модульной функцией, а не сценарием прослушивателя событий уровня document
. Итак, мне нравится ниже. Обратите внимание: вы не можете переадресовать элемент с одним и тем же прослушивателем событий, поэтому не беспокойтесь о прикреплении слушателя более одного раза - только один палец.
var iterations = 4;
var button;
var body = document.querySelector("body");
for (var i = 0; i < iterations; i++) {
button = document.createElement("button");
button.classList.add("my-button");
button.appendChild(document.createTextNode(i));
button.addEventListener("click", myButtonWasClicked);
body.appendChild(button);
}
function myButtonWasClicked(e) {
console.log(e.target); //access to this specific button
}
По конкретному вопросу: «Будет ли сбор pclass быть собранным»: подписка на событие не влияет на сбор pClass (как издатель).
Для GC вообще (в частности, цель) : зависит от того, является ли MyFunction статическим или основанным на экземпляре.
Делегат (например, подписка на события) к методу экземпляра включает ссылку на экземпляр. Так что да, подписка на события предотвратит GC. Однако, как только объект, публикующий событие (pClass выше), имеет право на сбор, это перестает быть проблемой.
Обратите внимание, что это односторонний; т.е. если у нас есть:
publisher.SomeEvent += target.SomeHandler;
, тогда «издатель» сохранит «цель», но «цель» не сохранит «издателя».
Итак, нет: if pClass собирается собираться в любом случае, нет необходимости отписывать слушателей. Однако, если pClass долговечен (длиннее экземпляра с MyFunction), то pClass может сохранить этот экземпляр живым, поэтому будет необходимо отказаться от подписки, если вы хотите, чтобы цель была собрана.
Статические события, однако, по этой причине очень опасны при использовании с обработчиками на основе экземпляров.
В тот момент, когда часть памяти больше не ссылается, она становится кандидатом на сбор мусора. Когда экземпляр вашего класса выходит за рамки, он больше не ссылается на вашу программу. Он больше не используется и, следовательно, может быть безопасно собран.
Если вы не уверены, что что-то будет собрано, задайте себе следующий вопрос: существует ли еще ссылка на него? Обработчики событий ссылаются на экземпляр объекта, а не наоборот.
pClass
будет собрано мусор. Однако, если фрагмент кода выше находится внутри другого класса, экземпляр этого класса может не очиститься, если вы не установите pClass
в null
.
Да, pClass будет собираться мусором. Подписка на мероприятие не подразумевает, что какая-либо ссылка существует для pClass.
Так нет, вам не придется отсоединять обработчик, чтобы pClass собирался собирать мусор.
WeakReference
, и в некоторых случаях это может быть хорошей идеей, но так часто, как не будет, это будет сильным. – supercat 13 April 2012 в 16:37