Variable ist immer "undefined"
Enrico
- javascript
0 Matthias Apsel0 Enrico
0 Worf
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
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)
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
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
Hallo Worf,
danke für Deine Hilfestellung.
Bitte entschuldige, aber ich verstehe nur Bahnhof.
Kannst Du mir das an einem Beispiel verdeutlichen?
Gruß,
Enrico
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
Hallo Worf,
danke für Dein kurzes Beispiel, jetzt ist mir die Reihenfolge der Abarbeitung klarer :-)
Gruß,
Enrico
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
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
[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!"
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