«Неопределенный» или «нулевой», в пользу которого сборщик мусора

1

Предположим, я создаю два объекта:

var a = new SomeObject();
var b = document.getElementById("someElement");
/* Do something with those two object */

После чего-то с этими двумя объектами мне нужно очистить их в случае утечки памяти.

Вопрос в том, какой из них я должен выбрать между "null" и "undefined", который предпочитает сборщик мусора.

// firstly, remove DOM node
b.parentElement.remove(b);

// then clear the variants using "null" or "undefined"
a = null;
b = null;

/* or:
a = undefined;
b = undefined;
*/

Любые комментарии будут оценены!

  • 0
    К вашему сведению, к ответу добавлен еще один абзац, в котором объясняется, когда вам может понадобиться это сделать. Например, я знаю, что ваш пример кода является просто составленным кодом, но в этих примерах a и b выйдут из области видимости, как только функция, определенная ими в возвращаемых значениях. В настоящее время все, на что ссылаются a и b будет недоступно через a и b . Если вы, например, запустили setTimeout с анонимной функцией, которая использовала a или b (закрывает на a или b ), тогда любой указатель останется в памяти до тех пор, пока этот обратный вызов больше не будет работать. Надеюсь, вы видите шаблон :)
Теги:
memory-leaks

1 ответ

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

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

Один из способов достижения объекта - это присвоение переменной. Присвоение нового значения переменной, которая в настоящее время указывает на объект (например, путем присвоения null для a), уменьшит количество ссылок на этот объект на единицу. Когда этот или любой счет ссылки на объекты уменьшается до нуля, он будет иметь право на сбор мусора.

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

Обратите внимание, что вам нужно только очистить переменные, подобные этой, если переменная остается доступной вашим кодом после функции, объявленной переменной в результатах. Это может произойти, если анонимная функция закрывается в переменной, если переменная является глобальной (привязана к global объекту или объявлена без ключевого слова var), или если эта переменная фактически является полем для объекта, который все еще доступен.

  • 1
    Хорошее вдохновение, спасибо!

Ещё вопросы

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