javascript анонимная функция сборки мусора - PullRequest
15 голосов
/ 09 июня 2011

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

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

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

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

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

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

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

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

Ответы [ 2 ]

10 голосов
/ 09 июня 2011

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

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 голосов
/ 09 июня 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...