Вы можете использовать console.dir(add3);
, чтобы увидеть конструкцию замыкания.Разверните свойство [[Scopes]]
, затем разверните объект 0: Closure
, и вы увидите только:
n: 3
Закрытие нигде не сохраняет значение title
.
Во втором примере переменная titles
по-прежнему является сборщиком мусора.Когда вы делаете:
var titles = narray.slice(0);
globaltable = globaltable.concat(titles);
происходит следующее:
- Копия
narray
создается slice()
и сохраняется в локальной переменной titles
. - Новый массив, содержащий содержимое
globaltable
, за которым следует содержимое titles
. - Этот новый массив хранится в
globaltable
.
Вс этой точки старое значение globaltable
становится мусором.И когда addNarray()
возвращается, значение titles
становится мусором, потому что замыкание в adder()
не имеет к нему никакого отношения.
Строки, которые были в titles
, не становятся мусором,потому что они все еще упоминаются в globalarray
.И narray
не становится мусором, потому что это ссылки в закрытии adder
.
По сути, закрытие должно only удерживать ссылки на переменные, которые упоминаются где-то в функциивернулся.Другие переменные во внешней области не нужно сохранять.
Основной принцип сборки мусора прост: если нет доступа к части данных, ее можно собрать как мусор.Иногда в реализации встречаются ошибки, но, как правило, можно предположить, что это правда.