Как закрыть память GCed? - PullRequest
       1

Как закрыть память GCed?

0 голосов
/ 26 апреля 2018

Все:

Я довольно плохо знаком с управлением javascript, когда я пытаюсь понять, как GC работает с закрытием, я запускаю один пример, например:

function addN(n){
    var title = "ADD "+n;
    return function adder(who){
        return who+n;
    }
}
var add3 = addN(3);
var result = add3(10);

Интересно, после завершения addNПри построении этого замыкания для add3 все еще остается в памяти title, или это просто n?

Другой пример:

var globaltable = []
function addNarray(narray){
    // narray is an string array
    var titles = narray.slice(0);
    globaltable = globaltable.concat(titles);
    return function adder(who){
        return narray.join(" - ");
    }
}

В этомНапример, получит ли title GCed ?

И мне также интересно, что, если этот массив будет массивом объектов типа {id:0, name:"idname"}, ответ будет тем же?

Если кто-нибудь знает ответ, поделитесь мыслью, и способ доказательства chrome devtool будет высоко оценен, или объясните немного с точки зрения использования памяти

Спасибо

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете использовать console.dir(add3);, чтобы увидеть конструкцию замыкания.Разверните свойство [[Scopes]], затем разверните объект 0: Closure, и вы увидите только:

n: 3

Закрытие нигде не сохраняет значение title.

Во втором примере переменная titles по-прежнему является сборщиком мусора.Когда вы делаете:

var titles = narray.slice(0);
globaltable = globaltable.concat(titles);

происходит следующее:

  1. Копия narray создается slice() и сохраняется в локальной переменной titles.
  2. Новый массив, содержащий содержимое globaltable, за которым следует содержимое titles.
  3. Этот новый массив хранится в globaltable.

Вс этой точки старое значение globaltable становится мусором.И когда addNarray() возвращается, значение titles становится мусором, потому что замыкание в adder() не имеет к нему никакого отношения.

Строки, которые были в titles, не становятся мусором,потому что они все еще упоминаются в globalarraynarray не становится мусором, потому что это ссылки в закрытии adder.

По сути, закрытие должно only удерживать ссылки на переменные, которые упоминаются где-то в функциивернулся.Другие переменные во внешней области не нужно сохранять.

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

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