2016-05-05 4 views
0

Ich habe eine Eltern/Kind-Beziehung, die so aussieht.Wird WeakMap mich vor einem Speicherverlust für die Eltern/Kind-Beziehung schützen?

parent.children = [child]; 
child.parent = parent; 
  1. Wird diese Ursache Speicherverlust, wenn alle anderen Verweise auf parent und child werden entfernt? Nur Referenzen, die übrig bleiben, werden sich gegenseitig zuordnen.

  2. Wenn es Speicherverlust aufgrund zyklischer Referenz verursachen wird, wird WeakMap mir retten?

WeakMap Verwendung,

var parentMap = new WeakMap(); 
parent.children = [child]; 
parentMap.set(child, parent); 

Ich denke, dass es nicht da, parentMap einen Verweis auf parent hat, und parent hat einen Verweis auf child. Es gibt immer noch eine zyklische Referenz.

Antwort

3

Nein. Wenn Sie alle anderen Verweise auf parent und child entfernen, werden sie als Müll gesammelt. Alle modernen Browser verwenden einen mark-and-sweep Algorithmus für die Garbage Collection, bei der Zyklen kein Problem darstellen. Sie müssen keine WeakMap verwenden (es wird Ihnen sowieso nicht helfen).

Allerdings, wenn eine Referenz auf parent oder child irgendwo noch existiert, wird keiner von ihnen gehen.