Вы не можете напрямую гарантировать, что объекты JavaScript будут удалены из памяти.Вы просто избавляетесь от всех ссылок, которые вам больше не нужны, что позволяет сборщику мусора выполнять свою работу.(Я бы не назвал это «слабым местом» - по сравнению с ручным управлением памятью, сильной стороной JavaScript является то, что он выполняет всю вашу работу.)
Вам не нужнобеспокоиться о функционально-локальных переменных: когда функция возвращается, переменные все равно выходят из области видимости.«Очистка» их вручную прямо перед этим ничего не дает.Пример:
function openInternalImageViewer(url) {
let imgViewer = new remote.BrowserWindow()
imgViewer.loadURL(url);
/* ...let user interact with imgViewer... */
imgViewer = null; // Useless assignment.
}
Это верно как для переменных let
, так и var
.
Конечно, это отличается для глобальных переменных (но, конечно, вы не должныу них их много):
var imgViewer;
(function openInternalImageViewer(url) {
imgViewer = new remote.BrowserWindow()
imgViewer.loadURL(url);
})(some_url);
/* ...let user interact with imgViewer... */
imgViewer = null; // This cleanup makes sense!
/* program execution continues, imgViewer no longer needed */
С точки зрения движка не имеет значения, назначаете ли вы null
, undefined
или 123
, поэтому вы можете выбрать любойЗначение имеет наибольшее значение для вас.
Кроме того, не имеет значения, откуда что-то было создано / выделено.Для сборки мусора важно, является ли объект «недоступным», т. Е. У вашего кода нет возможности когда-либо снова к нему добраться.
Чтобы проверить, работает ли он, вы должны использовать какую-то памятьинструмент анализа / профилирования.Простейшая форма - использовать диспетчер задач вашей операционной системы.Напишите тест примерно так:
for (var i = 0; i < 100; i++) {
openWindow();
closeWindow();
}
и посмотрите, продолжает ли потребление памяти всеми вовлеченными процессами возвращаться к своему первоначальному значению.Скорее всего, он этого не сделает сразу, вместо этого вы увидите «пилообразный» паттерн, где память продолжает расти, пока GC не сработает и снова не остановится.Вы можете рассмотреть форсирование циклов GC вручную в тесте;просто знайте, что в производственном коде это было бы пустой тратой времени, поскольку автоматическое поведение GC очень тщательно настраивало эвристику, чтобы сбалансировать время, затрачиваемое на сборку мусора, с доступной памятью.