2016-12-14 2 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されます。前述したように、あなたがRoomのインスタンスを含め、オブジェクトを削除することはできません

は部屋のこのインスタンスを削除します。あなたが行うことができることは、それを参照しているリストからそれを削除すること、および/またはそれを参照している可能性があるプロパティからオブジェクトを削除することです。再び、それらが唯一の残りの参照である場合、部屋はGCされるでしょう。

アレイルームの機能への参照を十分に削除していますか?特別なコマンドでこれを削除する必要がありますか?

この場合も、「参照を削除する」ことはできません。オブジェクト上のプロパティ(配列またはオブジェクトのいずれか)のみを削除できます。また、「配列ルームの機能」が何を意味するのかよく分かりません。私はあなたが意味することは、 "関数(コンストラクタ)Roomによって作成されたインスタンスである配列ルームの要素への参照を削除している"と思います。はい、それで十分です。あなたがしたい場合でもそれを "削除"する特別な方法はありません。

もちろん、オブジェクトへの参照を変数に保持することもできます。もちろん、変数を削除することはできません。あなたができることは、変数を何か他のもの(多くの場合、null)に設定することです。その変数が以前に保持していたオブジェクトを参照する最後のものだった場合、GC'dできるようになります。ただし、変数または変数に保持されていたオブジェクトへの参照を「削除する」と言っても間違いです。単にオブジェクトを放棄したり、孤立しているため、GCに適格になります。本当に "削除"という言葉を使いたいのであれば、それを削除しているガベージコレクタと言うことができますが、 "解放する"という言葉を使うのが普通です。

関連する問題