Предположим, я создаю два объекта:
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;
*/
Любые комментарии будут оценены!
Сборщик мусора работает, отслеживая, какие объекты доступны вашему коду. Идея состоит в том, что если объект недоступен, блок памяти, который он занимает, может быть освобожден без нарушения вашей программы.
Один из способов достижения объекта - это присвоение переменной. Присвоение нового значения переменной, которая в настоящее время указывает на объект (например, путем присвоения null
для a
), уменьшит количество ссылок на этот объект на единицу. Когда этот или любой счет ссылки на объекты уменьшается до нуля, он будет иметь право на сбор мусора.
Все, что говорилось, не важно, какое значение вы используете для замены значения переменной, если это не какой-то другой объект, который в противном случае был бы собран мусором. По этой причине как undefined
и null
будут работать.
Обратите внимание, что вам нужно только очистить переменные, подобные этой, если переменная остается доступной вашим кодом после функции, объявленной переменной в результатах. Это может произойти, если анонимная функция закрывается в переменной, если переменная является глобальной (привязана к global
объекту или объявлена без ключевого слова var
), или если эта переменная фактически является полем для объекта, который все еще доступен.
a
иb
выйдут из области видимости, как только функция, определенная ими в возвращаемых значениях. В настоящее время все, на что ссылаютсяa
иb
будет недоступно черезa
иb
. Если вы, например, запустили setTimeout с анонимной функцией, которая использовалаa
илиb
(закрывает наa
илиb
), тогда любой указатель останется в памяти до тех пор, пока этот обратный вызов больше не будет работать. Надеюсь, вы видите шаблон :)