Moderne Engines würden nicht verwendete Variablen im äußeren Bereich beibehalten.
Daher spielt es keine Rolle, ob Sie data = null
einstellen, bevor die innere Funktion zurückkehrt, weil die innere Funktion nicht davon abhängt („schließen over“) data
.
Wenn die innere Funktion auf data
abhing --perhaps es sie gibt - dann Einstellung data = null
ist sicherlich nicht, was Sie wollen, weil dann, na ja, wäre es null sein, anstatt den ursprünglichen Wert des Habens !
die innere Funktion Unter der Annahme, auf data
abhängt, dann ja, solange inner
zu (nach) etwas hingewiesen wird, dann wird der Wert von data
wird um gehalten werden muß. Aber das sagst du, was du willst! Wie können Sie etwas verfügbar haben, ohne es verfügbar zu haben?
Denken Sie daran, dass die Variable, die den Rückgabewert von f()
enthält, an einem bestimmten Punkt nicht mehr in den Gültigkeitsbereich fällt. An diesem Punkt, mindestens bis f()
wird erneut aufgerufen, data
wird Müll gesammelt werden.
Die allgemeine Regel ist, dass Sie sich keine Gedanken über Speicher und Lecks mit JavaScript machen müssen. Das ist der springende Punkt von GC. Der Müllsammler leistet eine hervorragende Arbeit, um zu identifizieren, was benötigt wird und was nicht benötigt wird, und den Müllsammler zu behalten, der letzteres sammelt.
Sie können das folgende Beispiel in Betracht ziehen:
function foo() {
var x = 1;
return function() { debugger; return 1; };
}
function bar() {
var x = 1;
return function() { debugger; return x; };
}
foo()();
bar()();
Und seine Ausführung untersuchen in Chrome variable Fenster DevTools. Wenn der Debugger in der inneren Funktion von foo
stoppt, beachten Sie, dass x
nicht als eine lokale Variable oder als eine Schließung vorhanden ist. Für alle praktischen Zwecke existiert es nicht.
Wenn der Debugger in der inneren Funktion von bar
stoppt, sehen wir die Variable x
, weil es beibehalten werden musste, um zugänglich zu sein, um zurückgegeben zu werden.
Stimmt das heute? Oder ist dieser Artikel veraltet?
Nein, tut es nicht, und ja, ist es. Der Artikel ist vier Jahre alt, was ein Leben lang in der Webwelt ist. Ich habe keine Möglichkeit zu wissen, ob jQuery noch immer undicht ist, aber ich wäre überrascht, wenn es so wäre, und wenn ja, gibt es einen einfachen Weg, sie zu vermeiden - benutze jQuery nicht. Die Lecks, die der Autor des Artikels in Bezug auf DOM-Schleifen und Event-Handler erwähnt, sind in modernen Browsern nicht vorhanden, mit denen ich IE10 (wahrscheinlicher IE9) und höher meine. Ich würde vorschlagen, eine aktuellere Referenz zu finden, wenn Sie wirklich über Speicherlecks verstehen wollen. Eigentlich würde ich vorschlagen, dass Sie hauptsächlich aufhören, sich über Speicherlecks Sorgen zu machen. Sie treten nur in sehr speziellen Situationen auf. Aus diesem Grund ist es heutzutage schwierig, viel zu diesem Thema im Internet zu finden. Hier ist ein Artikel, den ich gefunden habe: http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html.
Dank Torazaburo. Was mich beunruhigt, ist, dass der letzte Ausschnitt in dem Artikel, den Sie über den Meteor-Fehler zur Verfügung gestellt haben, tatsächlich Speicher in V8 verliert. – Jonathan
"Eigentlich würde ich vorschlagen, dass Sie hauptsächlich aufhören, sich Gedanken über Speicherlecks zu machen. Sie treten nur in sehr speziellen Situationen auf." Ich stimme dieser Aussage nicht zu. Zumindest Detached DOMs treten häufig in SPAs auf und jeder Entwickler muss darüber Bescheid wissen. –