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,因爲窗口持有對其的引用。

相關問題