Сборка мусора JavaScript в закрытии - PullRequest
2 голосов
/ 11 октября 2011

Я использую замыкания в игровом движке для объектов.Скажите что-то вроде:

var newSprite = function() {
   var x = 0;
   var y = 0;
   var returnobj = {
       getPos:function(){
          return [x,y];
       }
   }
   return returnobj;
}

Это не настоящий код, но он хорошо иллюстрирует.У меня есть объекты в графе сцены, если я установлю нулевые объекты в графе сцены, будет ли сборщик мусора собирать все это правильно?Должен ли я установить для каждой переменной значение null?

Ответы [ 2 ]

5 голосов
/ 11 октября 2011

Это произойдет, если:

  1. Кто-то еще держит ссылку на данный спрайт.
  2. Кто-то еще держит ссылку на метод someSprite.getPos.

Пример:

var sceneGraph = [newSprite(), newSprite(), newSprite()];
var gotYourSprite = sceneGraph[0];
var gotYourMethod = gotYourSprite.getPos;

sceneGraph = null;
// gotYourSprite is still available and is not GC'ed, but the other two are gone.
gotYourSprite = null;
// gotYourSprite is gone, but neither the method nor the private variables can be
// GC'ed because you still have gotYourMethod, which captured x and y.
gotYourMethod = null;
// Now everything will be GC'ed.
0 голосов
/ 11 октября 2011

Да - как только ваш объект станет нулевым, ссылки в закрытии больше не будут доступны и будут собираться мусором. При условии, что ничто другое не имеет ссылки на вещи внутри этого объекта.

...