2011-03-27 73 views
7

我有一個程序,使用Javascript作爲腳本語言綁定到一個更大的C++應用程序。我可以交換使用V8和webkit,但底層運行時對這個問題應該不重要。垃圾收集關閉規則與Javascript

在這個應用程序中,我有動態創建的對象會收到回調。我將創建這個回調像這樣綁定...

function f() { 
    var obj = CreateNewCallbackObj(); 
    obj.onCallback = dowork; // dowork is a function 
} 

顯然,這將有GC問題,因爲OBJ已經超出了範圍,並最終會被刪除。

我想要的是讓對象自我管理它的一生。該對象最終會收到一個回調,表示它的生命即將結束,如果發生這種情況,它可以刪除它自己。

一個想法是通過添加一個obj.myself = obj來自引用。這似乎是錯誤的做法,但它可能工作,除非垃圾收集算法很聰明。

有沒有正確的方法來做到這一點?沒有用於存儲對象的基礎持久性DOM,所有JS對象都根據需要動態分配,但需要一些方法在JS引擎中保留。

回答

7

自引用將而不是保證任何東西都活着。事實上,大約沒有自我尊重的GC'd語言(我知道)使用單獨的refcounting實現。甚至不要想到濫用GC算法或任何其他實現定義的細節 - 這就是瘋狂。

作爲替代方案:創建一些總是可到達的(例如全局)對象,其保持所有這些對象(從而使他們活着),並提供到刪除對象的方法。然後請別人提供參考 - 甚至更好,不要擔心這一點。 GC的重點在於,當內存被釋放時,你不應該(必須)知道/關心。

您還可以添加alive屬性,檢查在所有方法的開始處,如果在調用方法時產生錯誤,當然這不是保證,但它可以幫助調試。