Javascript анонимная функция сборщик мусора

Если у меня есть такая функция

function do(callback) {
  //do stuff
  callback();
}

а затем я передаю анонимную функцию:

do(function() { //do something else });

делает ли это анонимную функцию когда-либо собранной в течение срока службы страницы? Если нет, как я могу сделать его доступным для GC?

Должен ли я это сделать?

var h = function() { //do something };
do(h);
delete h;

Мне даже нужно беспокоиться об этом? Я создаю веб-приложение, которое имеет длительный срок службы, делает много вызовов ajax, сохраняя объекты на некоторое время, и на самом деле не требует обновления страницы для навигации через. Поэтому я пытаюсь выяснить, могу ли я попасть в монстр утечки памяти.

Ответы

Ответ 1

Единственная ссылка на анонимную функцию - это аргумент функции, который исчезает, когда функция заканчивается, поэтому после этого ваш обратный вызов будет доступен для сбора мусора. За исключением случаев, когда что-то другое ссылается на него, что может легко случиться с закрытием:

function doo(callback) {
    $.get(url, function() {
        // callback is visible here!
    });
    callback();
}
doo(function() { /* do something else */ });

callback (наряду со всей областью, созданной вызовом doo), должен оставаться в памяти, потому что внутренняя функция может ссылаться на нее через закрытие; это может быть только сбор мусора, когда внутренняя функция - сбор мусора, и поскольку эта функция является свойством объекта jqXHR, этот объект должен быть собран до этого мусором, и кто знает, когда это произойдет...

Обновление. Вы можете избежать ненужных замыканий, не определяя свои функции внутри других функций:

var func = function() {
    // callback is not visible here
}
function doo(callback) {
    $.get(url, func);
    callback();
}
doo(function() { /* do something else */ });

Ответ 2

Следите за циркулярными ссылками, иначе GC для браузера очистит их. Закрытие упрощает создание круговой ссылки, и это может быть захвачено в память, даже если вы просматриваете страницу, которая ее создала. Таким образом, веб-приложения, которые остаются на экране в течение длительных периодов времени, особенно уязвимы.

Ознакомьтесь с разделом "Утечки памяти" здесь: https://developer.mozilla.org/en/A_re-introduction_to_JavaScript.

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