2010-04-30 9 views
6

In Bezug auf jQuery Nutzenfunktion jQuery.data() der Online-Dokumentation sagt:Warum .data() - Funktion von jQuery ist besser, um Speicherlecks zu verhindern?

„Die jQuery.data() Methode ermöglicht es uns, zu befestigen Daten jeglicher Art zu DOM Elemente in einer Weise, die sicher ist, . von zirkuläre Referenzen und daher von Speicherlecks "

Warum verwenden:

document.body.foo = 52; 

kann ein Speicherleck -oder in welcher Bedingungen- führen, so dass ich

jQuery.data(document.body, 'foo', 52); 

Soll ich immer lieber .data() anstelle von ExpandOS in jedem Fall verwendet werden sollte?

(ich würde es begrüßen, wenn Sie ein Beispiel zur Verfügung stellen kann, die Unterschiede zu vergleichen)

Danke,

burak Ozdogan

+1

Könnte http://stackoverflow.com/questions/1056098/what-sort-of-memory-leaks-should-i-watch-for- mit-jquerys-daten beantworten sie ihre frage? – Konerak

+0

Darf ich raten? IE leidet seit einem Jahrzehnt an diesem Übel. Aber AFAIK passiert nur, wenn Sie ein DOM-Element entfernen/entfernen, während Event-Handler noch gesetzt sind. – jweyrich

+0

@jweyrich: Während IE Berühmtheit für Speicherleck bekannt ist, sind andere Browser nicht dagegen immun. –

Antwort

6

Es ist besser genau wegen etwas, das es in dem Zitat sagt, das Sie gaben: "sicher von den kreisförmigen Bezügen."

Angenommen, Sie haben Variablen nodeOne und nodeTwo, die Referenzknoten.

Sagen Sie bitte diese dann in Funktion gesetzt (deren Referenz Sie nicht speichern):

jQuery.data(nodeOne, 'item', nodeTwo); 
jQuery.data(nodetwo, 'item', nodeOne); 

Nachdem die Funktion ausgeführt wird, gibt es eine zirkuläre Referenz: nodeOne einen ref nodeTwo hat, und umgekehrt.

Durch die Verwendung von jQuery.data verhindert diese Zirkularreferenz nicht, dass diese beiden Variablen als Garbage Collection erfasst werden.

Wenn Sie jedoch die gleiche Sache zu tun sind, aber ohne jQuery.data verwenden, die nodeOne und nodeTwo Variablen nicht Müll gesammelt werden, auch wenn die Variablen nicht mehr benötigt werden.

-

Soll ich lieber .data IMMER() statt von ExpandOS in jedem Fall mit?

Wenn Sie große Datenmengen Einstellung tun und benötigen keine zusätzlichen Tropfen Leistung (und Sie mithilfe Profilierung sagen könnte) und sind sicher, dass Sie nicht zirkuläre Referenzen schaffen (oder zumindest eine Zahl, wäre wichtig), dann ja, Sie können auch nur jQuery.data verwenden.

+0

Lustig, das war Drive-by downvoted. – fig

+0

Warten Sie, ist Ihr Codebeispiel, das besagt, dass jQuery '.data()' 'nodeOne' und' nodeTwo' nicht müllsammeln lässt? –

+0

@Crescent Frisch, guter Punkt, ich werde das klarer machen. – fig

4

Ich bin mir ziemlich sicher vorstellen kann man nicht mit einem ein Speicherleck primitiver Wert wie 52. Speicherlecks mit Expandos treten normalerweise auf, wenn ein Wert angewendet wird, der ein Objekt mit einem Verweis auf das Element enthält.

Ich empfehle den Inhalt der Circular Reference Überschrift unter http://msdn.microsoft.com/en-us/library/Bb250448 zu lesen. Noch besser, lies alles :-)

Das soll gesagt werden, ich denke die meisten Leute empfehlen, wenn möglich, Expandos zu verwenden (und es ist normalerweise möglich). Die Verwendung von jQuerys data() ist in jedem Fall eine gute Alternative.


Nur realisiert, dass ich deine Frage nicht beantwortet habe lol. jQuery data() bietet eine Methode, die in etwa wie folgt lautet: für die Daten
  • Die Daten werden gespeichert in einem Objekt zur Verfügung, die data() Methode, mit der eindeutigen ID
  • Ein

    1. jQuery berechnet eine eindeutige ID expando Eigenschaft auf das Element mit der eindeutigen ID als Grundwert angewendet wird

    Wenn Sie data() aufrufen, um die Daten zu holen, greift jQuery die expando Eigenschaft für die eindeutige ID und verwendet diese ID, um die Daten zu holen aus dem Caching-Objekt. Da das Expando einen primitiven Wert enthält und keine Verbindung zum Caching-Objekt besteht, treten keine Zirkelbezüge auf.

  • +0

    Dank Andy E's Kopf (Das sieht etwas aus Futurama! :)) Sehr nützliche Informationen, die Sie bereitgestellt haben. – pencilCake

    +0

    @burak: Ich bin ein großer Futurama-Fan :-) –