闭包中的JavaScript垃圾收集

时间:2011-10-10 22:12:12

标签: javascript garbage-collection

我在游戏引擎中使用闭包来获取对象。说出类似的话:

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

这不是实际的代码,但它很好地说明了。我有一个场景图中的对象,如果我将场景图中的对象设置为null,垃圾收集会收集所有这些吗?我是否必须将每个变量设置为null?

2 个答案:

答案 0 :(得分:5)

除非:

  1. 其他人正在坚持对给定精灵的引用。
  2. 其他人正在继续引用someSprite.getPos方法。
  3. 示例:

    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.
    

答案 1 :(得分:0)

是 - 一旦您的对象为null,闭包中的引用将不再可访问,并将被垃圾回收。如果没有其他内容可以引用该对象内部的内容。