2012-03-28 12 views
2

Angenommen, ich den folgenden CodeWas passiert in JavaScript, wenn ich nie einen Rückruf anrufe?

function myFunction(param, callback) { 
    ... 
    if (err) { 
     console.log("error"); 
     console.log(err); 
    } 
    else { 
     callback(data); 
    } 
} 

Im Fall kein Fehler haben, wird der Rückruf aufgerufen. Im Falle eines Fehlers ist es nicht. Angenommen, die aufrufende Funktion sieht etwa wie folgt aus:

myFunction(param, function(data) { 
... 
}); 

Gibt es Speicherverlustprobleme oder ähnliches? Gibt es einen besseren Weg, dieses Szenario zu bewältigen?

+0

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

Antwort

9

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).

0

Sie müssen sich keine Gedanken über auslaufenden Speicher machen, ohne einen Rückruf aufzurufen. Möglicherweise möchten Sie einen Fehlerrückruf haben.

0

Hinzufügen zu der obigen Antwort siehe: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management. Wo es heißt:

Dieser Algorithmus die Definition reduziert „ein Objekt nicht mehr gebraucht“, um „ein Objekt ist nicht erreichbar“.

Dieser Algorithmus setzt das Wissen einer Gruppe von Objekten namens roots voraus (In JavaScript ist der Stamm das globale Objekt). In regelmäßigen Abständen wird der Garbage-Collector von diesen Wurzeln starten, alle Objekte finden, die von diesen Wurzeln referenziert werden, dann alle Objekte referenziert von diese usw. Ausgehend von den Wurzeln wird der Garbage Collector somit alle erreichbaren Objekte und finden sammle alle nicht erreichbaren Objekte.

Verwandte Themen