1

我正在为移动设备构建一些东西,并想以某种方式清除空对象变量以释放一些内存。在这里我有两个简单的例子,两个都是匿名函数,我相信但是更好或更有效的方法是什么?对不起,如果我把它全错了。对我来说,两者似乎都做了同样的事情,尽管我更喜欢第一个,因为在我需要它之前不会创建对象。第二个版本会立即执行创建变量,对象等的代码,但在我需要它之前不会执行主构建函数。更好的方法nulling变量,在javascript中的对象

我只是想弄清楚哪种方式更常见。我知道像我这样的初学者大多误解了匿名函数的使用。感谢您的贡献。

V1

var app = function() { 

     //create variables, objects 
     var a = 'Data 1'; 
     var b = 'Data 2'; 

     //do some things  
     console.log(a + ', ' + b); 

     //do a cleanup 
     app.cleanup = function() { 

      a = null; 
      b = null; 
      console.log(a, b); 

     } 
    } 
    setTimeout(app, 200); 

V2

var app = {}; 

    (function(){ 

     //create variables, objects 
     var a = 'Data 1'; 
     var b = 'Data 2'; 

     app.build = function(){     

      //do some things 
      console.log(a + ', ' + b);   

     } 

     //do a cleanup 
     app.cleanup = function(){ 

      a = null; 
      b = null; 
      console.log(a, b); 

     } 

     setTimeout(app.build,200); 

    })(); 

html或事件后来

<input type="button" onclick="app.cleanup()" value="clean" /> 
+1

你不应该担心释放资源。 JavaScript有一个垃圾收集器,它将拾取超出范围并摧毁它们的变量。当你不需要它时删除一个对象的引用('delete obj.yourReference',/'reference = null' /'reference = undefined'),并让垃圾收集器完成剩下的工作。 – Matt

+0

,但要删除一个引用或null,你会用我的V1或V2去?我的意思是我仍然需要在某个地方做到这一点。 – devjs11

+0

或简化@Matt所说的内容:如果变量变得不可用(其他方法无法以任何方式访问它),它将被标记为垃圾收集。基本上,如果一个变量是在函数中创建的(局部变量,就像你的情况),在函数结束后,没有人能够访问它,所以它会自动清理。 – bezmax

回答

2

你不应该担心关于释放资源。 JavaScript有一个垃圾收集器,它将拾取超出范围并摧毁它们的变量。当你不需要它时使用delete obj.yourReference,reference = null或类似的东西删除对象的引用,并让垃圾收集器完成剩下的工作。

如果您删除了app.cleanup()定义,您会发现#1会自动自动回收ab变量本身。除非你这样做,否则ab都包含在由您留下的cleanup函数创建的闭包中,因此您正在阻止垃圾回收器完成这件事。

要摆脱#1中的整个app,您必须做delete window.appapp = null,因为窗口持有对其的引用。

相关问题