Andreas Bierhals: Lokale Variable

Beitrag lesen

Hallo,

Damit bleibt aber meine Frage bestehen, was der JS-Interpreter mit den lokalen Variablen macht. Freigeben oder festhalten?

in rekursiven Funktionen muß ein Interpreter grundsätzlich alle lokalen Variablen aufbewahren, bis die momentane Rekursionstiefe wieder verlassen wird - sonst gibt es Inkonsistenzen. Ein anschauliches Beispiel ist z.B. die Routine aus dem Spiel "eggsweeper" (hier mittlerweile wohl bekannt *g*, ansonsten auf http://www.atomic-eggs.com...), in der die umliegenden Eier automatisch "aufgedeckt" werden, wenn man eine "0" erwischt hat (analog zum bekannten Windows-Minesweeper).

In dieser Routine wird zunächst geguckt, ob das Ei an der entsprechenden Position "nuklear verseucht" (oder was auch immer) ist. Wenn nicht, werden die verseuchten Eier in der unmittelbaren Umgebung (die 8 Nachbarfelder oben-links, oben, oben-rechts, links, ...) gezählt. Die Zahl der verseuchten Nachbarn wird an der Stelle des ausgewählten Ei's dargestellt, und das Feld wird als "aufgeklappt" markiert.

Wenn nun die Anzahl der verseuchten Nachbarn 0 beträgt, ist klar, daß man die umliegenden 8 Eier sowieso gefahrlos aufdecken kann - daher kann das JavaScript das ja auch gleich automatisch mit übernehmen. Es ruft dazu einfach rekursiv die selbe Routine der Reihe nach mit allen 8 Nachbarfeldern auf (und guckt natürlich vorher nach, ob die nicht schon vorher aufgeklappt waren - sonst gibt's u.U. 'ne Endlosrekursion).
Dabei ist natürlich wichtig, daß die Position, von wo aus die umliegenden Felder aufgedeckt wurden, gespeichert bleibt, sonst findet die Routine nicht mehr "zurück". Die Positionen werden also jeweils im Funktionsaufruf als Parameter übergeben und erhalten in jeder Rekursion eigenen Speicherplatz auf dem Stack als lokale Variable.

Meiner Erfahrung nach läuft bei den gängigen Browsern wie Netscape 4 und IE 4/5 der Stack leider sehr schnell über. So ab Rekursionstiefen der Größenordnung 100 steigen die Browser bereits aus (und Netscape 4.07 unter Linux z.B. eher noch früher als unter Win95...!) - was eigentlich auf heutigen Rechnern mit durchschnittlich >= 64 MB Speicher nicht unbedingt nachvollziehbar ist.

Soviel erstmal zu "meinem Senf" in dieser Sache... <g>

Viele Grüße

Andreas