2016-03-29 25 views
0

JavaScript(純粹的,不是jQuery,如果有要求的話)知道清除/釋放/從最後一次引用「延遲」函數中的對象從計時器或事件中調用?在「延遲」函數中引用的(本地)對象的JavaScript清理

看看下面的代碼:

function myInitFunc() 
{ 
    var myInitObj = new Object(); 
    myInitObj.properties = lotsOfStuff; 

    var myDelayedInitFunc = function() 
    { 
    doSomethingWith(myInitObj); 
    // I shall not be accessing myInitObj again now. 
    }; 

    // Let's say, *one* of the following: 
    setTimeout(myDelayedInitFunc, 1000); 
    window.addEventListener('load', myDelayedInitFunc); 
    document.addEventListener('DOMContentLoaded', myDelayedInitFunc); 
} 

注意myDelayedInitFunc()故意訪問變量myInitObj,這是本地myInitFunc()

例如,在http://javascript.info/tutorial/memory-leaks中聲明「在setTimeout/setInterval中使用的函數也在內部被引用並被追蹤直到完成,然後被清理」。這個「清理」是否理解它可以擺脫myInitObj以及函數本身?我有點猜測它......

這兩個事件的例子呢?即使我們知道它們是「一次性」事件,但我猜測myDelayedInitFuncmyInitObj都不會被清理乾淨?

如果它是其中的一些做清理,我應該讓myDelayedFunc()設置myInitObj = null;在其結束,從而最大限度地減少浪費的情況?

回答

1

是的,您無需清理該參考。如果你擔心你的JS代碼可能有內存泄漏,你應該閱讀memory profiling

+0

我很感謝您的快速響應。 「不需要清理」真的適用於那些*事件*以及'setTimeout'嗎?我可以理解後者,但是要清理這些事件意味着JavaScript理解這兩個事件名稱只會被稱爲一次?如果可能的話,我喜歡理解*理論*。 – JonBrave

+0

理論根據您查看哪個瀏覽器而有所不同,因爲每個瀏覽器都有不同的垃圾收集器實現。如果你想知道更多關於垃圾收集的內容,請閱讀這篇文章(http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection)... –

+0

有趣的閱讀本身,儘管它確實不要對我所問的情況有所瞭解。不過,我會接受你的斷言,這不是我應該擔心的,並將你的答案標記爲解決方案。 – JonBrave