• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Geltungsbereich von Variablen in Funktionen und Blöcken

vsenol

Mitglied
hallo Leute, hatte mir ein kleines Script geschrieben, um mir den Geltungsberiech von Variablen besser verdeutlichen zu können, dabei bin ich auf etw interessantes gestoßen wofür ich in keinem Buch und auch nicht im Internet eine Erklärung finde. Schaut euch bitte mal den Code an, der sehr einfach gestaltet ist:


HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Variablentest</title>
        <script type="text/javascript">
            // globale Variablen für den Zugriff auf das <body>, für das Beispiel unbedeutend
            var $ = document;
            var body = getElementById("body");

            function test(zahl) {

                // lokale Var mit Geltungsbereich innerhalb der Funktion
                 var funkScope = "Variable aus Funktionsscope ist sichtbar!";

                if (zahl) {
                    $.body.innerHTML = "<p><b>Lauf <i>1</i> in <i>if-Zweig 1:</i></b> " + funkScope;
                    funkScope = "Variable ist jetzt im if-Zweig 1 verändert. ";
                    $.body.innerHTML += "<p><b>Lauf <i>2</i> in <i>if-Zweig 1:</i></b> " + funkScope;
                    test();
                } else {
                    $.body.innerHTML += "<p><b>Lauf <i>1</i> in <i>if-Zweig 2:</i></b> " + funkScope;
                    funkScope = "Variable ist jetzt im if-Zweig 2 verändert. "
                    $.body.innerHTML += "<p><b>Lauf <i>2</i> in <i>if-Zweig 2:</i></b> " + funkScope;
                }

                for (var i= 0; i < 2; i += 1) {

                    $.body.innerHTML += "<p><b>Lauf <i>" + (i + 1) + "</i> im Funktionsrumpf, <i>außerhalb der if-Anweisung</i>.</b> " + funkScope + "Und ist im <i>gesamten Funktionsrumpf</i> sichtbar";
                }
            }
        </script>
    </head>
<body id="body" onload="test(1);">
</body>
</html>


Das eigenartige an der Sache ist jetzt, dass die Anweisung am Funktionsende zum 1. erst ausgegeben wird nachdem der else-Zweig durchlaufen wurde, da die Funktion ja im if-Zweig ohne Parameter neu aufgerufen wird und in den else-Zweig springt. (Da die Funktion neu aufgerufen wird, werden doch die lokalen Variablen gelöscht, so lernt man.) Doch wie sich zeigt wird nach Durchlauf des else-Zweig am Ende der Funktion angelangt die letzte Anweisung wider erwarten min. 2mal (statt 1mal) durchgeführt (auch ohne for-Schleife) und der 2.Durchlauf gibt den Wert der im if-Zweig veränderten Variable wieder, welche zu diesem Zeitpunkt gelöscht sein sollte.

Interessant zu sehen ist auch halt der Zustand ohne for-Schleife bzw. wenn var i auf 0 und die Bedingung von 2 auf 1 gesetzt wird:

for (var i= 0; i < 1; i += 1)


Der vermeintliche Fehler in Zähler in den letzten Ausgaben beweist glaube ich, dass die Varibale funkScope nach dem Durchlauf des if-Zweiges und einem erneuten Funktionsaufruf nicht gänzlich verloren geht, vll im globalen-Objekt zwischengespeichert wird!?

Versteht das jmd? Vielen Dank im vorraus.
 
Zuletzt bearbeitet:
Danke das ist ein sehr guter Link. leider habe ich Schwierigkeiten JS-bezogenes auf Englisch zu verstehen. Werde versuche ähnliches auf Deutsch zu finden.
 
Zurück
Oben