2011-02-02 66 views
11

在同一個變量`delete`是否確定要做到這一點?:`new`沒有在Javascript

function mygetTime() 
{ 
    var d = new Date(); 
    return(d.getTime()); 
} 

function wasteSomeMemory() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = mygetTime(); 
    } 
} 

會調用wasteSomeMemory()導致內存泄漏?

這個怎麼樣:

function wasteSomeMemory2() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = new Date(); 
    } 
} 

會調用wasteSomeMemory2()導致內存泄漏?我應該在for循環的末尾使用delete temp;嗎?

function wasteSomeMemory2() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = new Date(); 
     delete temp; 
    } 
} 

回答

29

newdelete有毫不相干在JavaScript中互辦(儘管他們混淆性相似的其他語言完全不同的結構)。不要擔心沒有明確地清理它們就創建對象(new),這就是垃圾收集器的工作。

new用於通過構造函數創建對象。另一方面,delete用於從對象中移除屬性。它具有什麼也沒有用於從內存中刪除對象,而不是作爲副作用(例如,如果唯一未完成的對該對象的引用來自您刪除的屬性)。正確使用delete

例子:

var obj = {}; 
obj.foo = "bar"; // Now `obj` has a property called `foo` 
delete obj.foo; // Now it doesn't 

getmyTime功能完全正常。在函數返回時,Date對象將立即有資格被回收(是否回收完全是執行)。它不會導致內存泄漏,除了一個錯誤的實現。

wasteSomeMemory2同樣不會造成內存泄漏,而事實上你不能通話delete temp;   —你只能刪除屬性,而不是瓦爾。


時候,你一定要幫垃圾收集器,但是那些通常不會(在我的經驗)有對象屬性做,因此不涉及delete。當你創建函數實例時,它們只會真的出現(如果你正在設置事件處理程序或定時器函數等,那就很常見了)。例如,考慮:

function foo() { 
    var listOfThings = /* ...get a list of things... */; 

    // ...do something with `listOfThings`... 

    setInterval(function() { 
     // ...do something that *doesn't* need `listOfThings`... 
    }, 1000); 
} 

因爲你已經通過setInterval分配給你的計時器匿名函數將生存函數調用,它讓現場引用到該函數調用時是在範圍內的一切(無論使用它或不)。這保留了listOfThings指向內存的列表。如果計時器功能不需要該列表,那就是一個問題。您可以釋放列表listOfThings點,如果你知道的功能並不需要它,通過分配undefinednull或任何以listOfThings當你用它做:

function foo() { 

    var listOfThings = /* ...get a list of things... */; 

    // ...do something with `listOfThings`... 

    listOfThings = undefined; // Done with it   <== The new bit 

    setInterval(function() { 
     // ...do something that *doesn't* need `listOfThings`... 
    }, 1000); 
} 

同樣是真實的事件處理函數等。每當你創建一個函數,它就會「關閉」(保留一個實時引用)任何在它定義的範圍內的東西。所以,如果你不需要這些東西,你可以通過清除對它們的引用來確保它們不被記憶。 (更多:Closures are not complicated

4

簡短的回答是否定的。

長的答案是我們希望上帝的瀏覽垃圾收集器撿起來。