2016-07-15 22 views
4

Wenn $ dom ein jQuery-Element ist,Hat die jQuery.clone-Methode Nebenwirkungen?

Kann diese Zeile sicher entfernt werden, wenn a nicht verwendet wird?

var a = $dom.clone(true,true); 

Als das Verfahren des dom klonen, ich glaube $dom.clone(false,false) nicht side effects habe. Wenn Sie denken, dass diese Methode auch keinen Fehler auslösen kann. Ich bin skeptischer gegenüber dem Klon der Ereignisse. Ich denke, wenn das geklonte Element nicht wieder angebracht wird, hat es keine Auswirkungen, aber ich bin mir nicht sicher. Gibt es ein Ereignis, das an ein losgelöstes Dom-Ereignis weitergegeben werden kann?

https://api.jquery.com/clone/

Ziel der Frage (wenn ja, dann bin ich nicht sicher können wir sicher, dass die Linie entfernt) ist zu bestimmen, ob das Fehlen von @nosideeffects ist ein Fehler in der Externen Definition von .clone() hier: https://github.com/google/closure-compiler/blob/master/contrib/externs/jquery-1.9.js#L405

+0

"Kann diese Zeile sicher entfernt werden, wenn eine nicht verwendet wird?" Wenn Sie kein verwenden, hat es keinen Sinn, es zu klonen. – Liam

+2

@ Liam: "Nebenwirkungen" ist ein ziemlich gebräuchlicher Begriff in Software-Engineering-Theorie. 'console.log' hat zum Beispiel Nebenwirkungen; es ist keine reine Funktion (es hat ausgegeben). –

+0

@Liam Ich meine Nebenwirkungen nach dem Schließen Compiler-Verhalten, das, ich denke, kann erklärt werden: "Kann diese Zeile sicher entfernt werden, wenn ein nicht danach verwendet wird?" (unabhängig von dem Code drumherum) – Tom

Antwort

2

Ob das Fehlen dieser Anmerkung ein Fehler in Bezug auf die Closure-Compiler-Definition von "keine Nebenwirkungen" ist, liegt ganz bei Google. :-)

In mindestens jQuery 1.x Aufruf .clone mit true, true mutiert Statusinformationen jQuery, Informationen, die sie nicht nur auf die Elemente halten mit dem jQuery-Objekt zurückgegeben und die damit verbundenen, die von a verwiesen endet: jQuerys Datencache für das Element (das sowohl für "data" als auch für Event-Handler-Informationen verwendet wird) wird nicht im Element selbst gespeichert. Es wird in einer Struktur in jQuery gespeichert, die kodiert ist durch eine expando-Eigenschaft für das Element. Es ist also keine wirklich reine Funktion; Es mutiert den Zustand von etwas: jQuerys Datencache.

In jQuery 2.x und höher glaube ich, dass die Informationen auf dem Element selbst gespeichert werden (seit 2.x und höher nicht IE6 und IE7, die GC über die DOM/JS-Grenze nicht korrekt tun konnte)).

+0

Es ist also kein Fehler für diese Datei. Jetzt bin ich noch unsicher für jQuery 2.x und 3.x. Die ursprüngliche Diskussion beginnt dort: https://github.com/google/closure-compiler/pull/1839#discussion_r70758049 (muss nach dem Laden der Seite F5 gedrückt werden, wenn github an die richtige Stelle scrollen soll ...) – Tom