Ein JavaScript-Objekt ist nicht für die Reklamation so lange, wie es erreichbar ist: wenn es erreicht werden kann, indem das Objektdiagramm von einem Stammobjekt durchlaufen wird (was im Grunde eine globale Eigenschaft oder ist) , möglicherweise geschlossen, variabel). Jedes Objekt, das nicht mehr stark erreichbar ist, ist nicht mehr über JavaScript zugänglich und wird vom GC zurückgewonnen (wenn der GC sich danach fühlt).
In diesem Fall wird die Funktion-Objekt (Rückruf) zu myFunction
bestanden ist nur stark erreichbar für die Dauer der Anruffunktion, wenn es erreichbar über die * callback
Parameter ist. Da das Funktionsobjekt nach der Funktion nicht stark erreichbar ist (z. B. wurde es nicht in einer globalen Eigenschaft gespeichert), kann das Funktionsobjekt wiedergewonnen werden - zusammen mit allen Funktionsbereichen, auf die verwiesen wird, sollten sie nicht mehr stark erreichbar sein - sobald die Funktion beendet wird.
Also in diesem Fall gibt es kein "Speicherleck". Stellen Sie sich diesen Fall jedoch vor:
window.myCallbacks = []
function myFunction(param, callback) {
...
window.myCallbacks.push(callback) // hmm, maybe always strongly-reachable?
}
Glückliche Kodierung.
Technisch gesehen eine echte Smart könnte JavaScript-Engine bestimmt, dass das Objekt von callback
benannt war nicht mehr stark erreichbar (über callback
) in dem "if" Zweig. Ich bin mir nicht sicher, ob einer der JS-Engines tatsächlich so weit geht, aber die Frage wird interessanter, wenn man über Funktionsbereiche spricht, die in Closures gebunden sind (und alle Objekte, die später aufgerufen werden, stark festlegt -erreichbar).
Konsole.Log kann auch als Rückruf angesehen werden; und der Code innerhalb des "else" -Blocks wird niemals ausgeführt. Sie haben also eine anonyme Funktion definiert, aber nicht ausgeführt. Ich sehe keine Probleme in Ihrem Code. Nur eine Überlegung, ich bin kein Profi – gpasci