Enrico: Variable ist immer "undefined"

Hallo,

ich flippe noch aus.

Ich habe folgende (hier vereinfacht dargestellte) Funktion:

  
function SidebarAufbauen()  
{  
   var Sidebar  = '...html-Definitionen...';  
       Sidebar += '...weitere html-Definitionen...';  
  
   Sidebar += MenueAufbauen();  
  
   Sidebar += '...weitere html-Definitionen...';  
  
   $("td.Sidebar").html(Sidebar);  
}  

Diese Funktion erzeugt das Gerüst unseres Menüs und ruft in ihrem weiteren Verlauf die nachfolgende (hier vereinfacht dargestellte) Funktion auf:

  
function MenueAufbauen()  
{  
   $.get("INC/XML/Menue.xml", function(xml)  
   {  
      var Menue = "";  
      var Menuestruktur = $.xml2json(xml);  
  
      for (var i = 0, l = Menuestruktur.Hauptmenue.length; i < l; i++)  
      {  
         Menue += Menuestruktur.Hauptmenue[i];  
  
         ... weitere Anweisungen ...  
      }  
  
      return Menue;  
   });  
}  

In dieser Funktion wird das eigentliche Menü aufgebaut. Es erfolgt hier aber noch keine Ausgabe, sondern die Variable "Menue" wird fortlaufend ergänzt.

Letztendlich soll die Variable "Menue" wieder an die vorherige Funktion zurückgegeben werden.

Wenn ich mir nun in der ersten Funktion zu Testzwecken die Variable "Menue" mit dem alert-Befehl ausgeben lasse, kommt nur "undefined".

Ich habe es mit und ohne "var" probiert und innerhalb und außerhalb der Funktionen, aber immer mit dem selben Effekt.

Die xml-Datei wird korrekt eingelesen und ich erhalte auch ein gültiges json-Objekt, daran liegt es nicht.

Warum ist die Variable "Menue" immer undefined und wie bekomme ich diesen Fehler (?) weg?

Danke und Gruß,
Enrico

  1. Om nah hoo pez nyeetz, Enrico!

    Warum ist die Variable "Menue" immer undefined und wie bekomme ich diesen Fehler (?) weg?

    Es ist eine lokale Variable, die nur innerhalb der Funktion verwendet wird. Außerhalb ist die Variable unbekannt. Allerdings ist der Wert dieser Variablen der Rückgabewert der Funktion MenueAufbauen(). Deshalb sollte außerhalb ~~~javascript alert (MenueAufbauen());

      
    Matthias
    
    -- 
    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen [neu und neutral](http://selfhtml.apsel-mv.de/java-javascript/index.php?buchstabe=N#neu).  
    ![](http://www.billiger-im-urlaub.de/kreis_sw.gif)  
    
    
    1. Hallo Matthias,

      danke für Deine Antwort.

      Es ist eine lokale Variable, die nur innerhalb der Funktion verwendet wird

      Hmm, aber auch ein Umbau bringt nicht den gewünschten Erfolg :-|

        
      function SidebarAufbauen()  
      {  
         Menue = "";  
      ...  
      Sidebar += MenueAufbauen(Menue);  
      ...  
      }  
      
      

      In der Funktion "MenueAufbauen()" habe ich jetzt nur noch den weiteren Aufbau der Variablen "Menue" und deren return.

      Ich raffe es einfach nicht.

      Gruß,
      Enrico

  2. Hallo,

    die Variable "Menue" ist innerhalb der inneren Funktion sehr wohl definiert. Die return-Anweisung springt jedoch lediglich aus dieser inneren Funktion (Callback der get()-Methode) heraus. Es handelt sich also nicht um den Rückgabewert der Funktion "MenueAufbauen".

    Zudem wird die get-Methode asynchron ausgeführt - Du versuchst jedoch, die Methode synchron zu verwenden.

    Eine mögliche Lösung könnte sein, dass Du der MenueAufbauen-Funktion eine Callback-Funktion übergibst, welche das Ergebnis dann im Dokument einfügt.

    Gruss,
    Worf

    1. Hallo Worf,

      danke für Deine Hilfestellung.

      Bitte entschuldige, aber ich verstehe nur Bahnhof.

      Kannst Du mir das an einem Beispiel verdeutlichen?

      Gruß,
      Enrico

      1. Hallo,

        ein kurzes Beispiel (ungetestet):

        function SidebarAufbauen()  
        {  
        	var $sidebar = $("td.Sidebar");  
          
        	// Ersten Inhalt platzieren  
        	$sidebar.html('...html-Definitionen...');  
          
        	// ..  
          
        	// weiteren Inhalt anfuegen  
        	MenueAufbauen(function(content) {  
        		$sidebar.append(content);  
        	});  
          
        	// ..  
          
        }  
          
        function MenueAufbauen(callback)  
        {  
        	$.get("INC/XML/Menue.xml", function(xml)  
        	{  
        		var Menue = "";  
          
        		// Menue zusammenbauen ..  
        		// -%-  
          
        		// Callback aufrufen (welches den Inhalt einfuegt)  
        		callback(Menue);  
        	});  
        }  
        
        

        Bzgl. Unklarheit betreffend "Asynchronität":
        Die get-Methode ist eine kurze Variante der ajax-Methode, welche (default) asynchron ausgeführt wird. Asynchron bedeutet hier, dass der Programmablauf nach dem Funktionsaufruf direkt weitergeführt, und nicht auf die Abarbeitung der Funktion gewartet wird.

        Ich rate dazu, die jQuery-Dokumentation hierzu zu lesen.

        Gruss,
        Worf

        1. Hallo Worf,

          danke für Dein kurzes Beispiel, jetzt ist mir die Reihenfolge der Abarbeitung klarer :-)

          Gruß,
          Enrico

    2. Om nah hoo pez nyeetz, Worf!

      Die return-Anweisung springt jedoch lediglich aus dieser inneren Funktion (Callback der get()-Methode) heraus. Es handelt sich also nicht um den Rückgabewert der Funktion "MenueAufbauen".

      Richtig. Wer gucken kann, ...

      Matthias

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Ata und Atari.

      1. Hallo Matthias,

        Richtig. Wer gucken kann, ...

        Das mit der Asynchronität und dem Herausspringen aus der "inneren" Funktion war mir nicht klar und ist es mir auch jetzt noch nicht.

        Gruß,
        Enrico

        1. [latex]Mae  govannen![/latex]

          Das mit der Asynchronität und dem Herausspringen aus der "inneren" Funktion war mir nicht klar und ist es mir auch jetzt noch nicht.

          Dein Problem -- molily hat dir in den letzten Tagen schon mehrfach nahegelegt, dich mit einem Buch oder Online-Ressourcen zu Javascript zu beschäftigen und die Grundlagen zu lernen.  Dann wüßtest du soetwas.

          Offenbar machst du aber lieber bei jedem Teilproblem einen neuen Thread auf und wartest auf einen Blöden, der dir ein Stück Code schreibt.

          Stur lächeln und winken, Männer!

          Kai

          --
          Array(16).join("x" - 1) + " Batman!"
          „Die Borg würden nicht mal Spaß verstehen, wenn sie einen Vergnügungspark assimiliert hätten!” (B'Elanna Torres)
          SelfHTML-Forum-Stylesheet
          1. Hallo Kai,

            wartest auf einen Blöden, der dir ein Stück Code schreibt.

            Besten Dank für Deine hilfreiche Antwort und Deine Unterstellung.

            Gruß,
            Enrico