2016-12-14 56 views
3

我有以下代碼:正在刪除對函數的引用,刪除函數的實例?

var NewRoom = new Room(OpenRoom[OpenRoom.length - 1].RID) 
NewRoom.addPlayer(socket.id); 
NewRoom.addSocket(socket); 
Rooms.push(NewRoom); 

這是我如何創建一個新的房間,現在當所有人都離開我要刪除的房間這instace。

正在刪除對數組房間的引用足夠了嗎?或者我必須用特殊的命令刪除它嗎?

這是我現在該怎麼刪除它:

if(output[0].ListOfSockets.length == 0) 
{ 
    var index = Rooms.indexOf(output[0]); 
    if (index > -1) 
    { 
     console.log('Deleted room when there is no one else more'); 
     Rooms.splice(index, 1); 
    } 
} 

在這裏,我刪除參考函數,而不是函數本身的實例。

如果我看了this對,明白它不錯,當我刪除引用該函數時,垃圾回收會刪除函數嗎?

+3

*如果我讀了這個權利並理解它很好,當我刪除對該函數的引用時,垃圾回收會刪除該函數?*你實際上並沒有刪除引用,你只是從數組中刪除引用。如果你不再在別的地方引用它,內存將被垃圾收集釋放,是的。 – nils

+0

感謝您確認@nils, –

+0

@nils因此,如果我想刪除引用,我需要使用下面的代碼:Rooms [index] = null? –

回答

4

一個對象不能被刪除。如果沒有人堅持引用它,我們只能等待它被垃圾收集。

我們可以刪除的是對象的屬性,如foo.bar。這對foo.bar曾用於指代的任何內容都沒有任何影響。它只是從foo中刪除bar屬性。但是,如果foo.bar是最後一件涉及它所做的事情,那麼現在可以GC'd。

刪除的房間這種情況下

正如上面提到的,你不能刪除的對象,包括Room一個實例。你可以做的就是從你保留的引用它的列表中移除它,並且/或者從其屬性可能引用它的對象中移除它。再次,如果這些是唯一的剩餘參考,那麼房間將被GC'd。

正在刪除對數組房間的引用足夠了嗎?或者我必須用特殊的命令刪除它嗎?

同樣,你不能「刪除一個引用」 - 你只能刪除一個對象的屬性,無論是數組還是對象。我也不確定你的意思是「陣列房間的功能」。我猜你的意思是「刪除數組中元素的引用,它是由函數(構造函數)Room創建的實例。」是的,這就夠了。即使你想要「刪除」,也沒有其他特殊的方法。

當然,對一個對象的引用也可以保存在一個變量中。當然,你不能刪除一個變量。你可以做的是將變量設置爲別的東西(通常爲null),如果該變量是引用先前保存的對象的最後一件事,那麼它現在可以被GC'd。但是,說你正在「刪除」該變量或變量中保存的對象的引用是不正確的。你只是放棄或孤兒對象,這使得它符合GC的條件。如果你真的想使用「刪除」這個詞,你可以說它是垃圾收集器正在刪除它,儘管使用「釋放它」這個詞是正常的。