jobo: pass by reference - verständnisproblem

Beitrag lesen

Hallo,

Mit einem Funktionsaufruf wird eine neue Schublade aufgemacht und ein einfacher Wert darin abgelegt. Legt man etwas anderes dort hinein, ändert sich nicht plötzlich der Inhalt anderer Schubladen in ganz anderen Schränken.

Je länger ich darüber nachdenke, so mehr erscheint mir das als passende Metapher. Gut, es ist nichts neues, Variablen als »Schubladen« zu veranschaulichen. Man muss dieses Bild allerdings noch modifizieren:

Es gibt verschiedene Regale (Variablenobjekte) mit benannten Schubladen (Variablen). Unter einem Namen sind dort Werte abgelegt. var a = 1; erzeugt eine Schublade mit dem Etikett a, darin liegt die Nummer 1.

Im Falle eines Objects, beispielsweise var a = {}, liegt der Wert nicht direkt in der Schublade. Sondern er liegt in einem separaten Object-Regal, das von den Variablen-Regalen getrennt ist. Dort ist es unter einer eindeutigen Nummer zu finden, meinetwegen 14825. In der Variablen-Schublade »a« liegt nur ein Zettel, auf dem steht: »siehe Object 14825«.

Beim Übergeben des Werts sowie beim Zuweisen an eine Variable wird immer mit einem Verweis-Zettel hantiert: Es wird ein weiterer Verweis-Zettel angelegt, auf dem dasselbe steht. Wenn man mit dem tatsächlichen Wert arbeiten will (Operatoren darauf anwendet), so wird anhand des Verweis-Zettels das Object aus dem Object-Regal geholt.

Solange es Zettel gibt, die auf ein Object verweisen, wird es im Object-Regal aufbewahrt. Andernfalls wird es beim Aufräumen irgendwann entfernt (Garbage Collection).

Erklärt sich so auch, warum ich zwar eine Objektvariable ändern kann (obj.x) wenn mir obj als Paramter übergeben wurde, nicht aber das Objekt selbst auslöschen kann?

Schubladenmodelle finde ich sehr anschaulich. So kann man ja auch Pointer veranschaulichen. Ein reservierte Speicher im RAM ist ja auch nix anderes als eine Schublade eigentlich. Ich wollte mal ein Stackmodell mit Streichholzschachteln basteln (;-).

Gruß

jobo