Antje Hofmann: falsche variablenübergabe! warum?

Beitrag lesen

Hallo Pat

supi das wars!
das muss man auch erstmal wissen, wo kann ich denn solche feinheiten nachlesen?

eigentlich an sehr wenigen Stellen. Solche Feinheiten erwirbt man vorallem durch Erfahrung. Ich kann dir aber mal zeigen, wie man darauf kommt und was hinter dem Problem steckt.

window.setInterval erhält als ersten Parameter einen String übergeben.
Also window.setInterval("einString",Zeit)

Nach Ablauf des Intervals wird die Information in diesem String verarbeitet.

Nun braucht man sich nur noch zu überlegen, wie wird dieser String
zusammengebaut.

Beispiel:

Deine Parameter sind nr=2 und anzahl=3. Du möchtest daraus den String zeige_zu(2,3) bilden.

Dein Ansatz war:
deinString="zeige_zu("+nr,anzahl+")"

Hier bist du dann über das Komma gestolpert. Das Komma ist der Operator für die Aneinandereihung. Er gibt jeweils den dem Komma folgenden Wert zurück. Einige JavaScriptmethoden können mit diesen umgehen, andere nicht.

Laß dir mal ausgeben:

alert("zeige_zu("+nr,anzahl+")");

und

document.write("zeige_zu("+nr,anzahl+")");

hier siehst du deutlich den Unterschied. Das Alert beachtet den Kommaoperator nicht, er interpretiert ihn aber, da keine Fehlermeldung erzeugt wird.  document.write() dagegen verarbeitet des Rückgabewert des Operators. Gleichzeitig siehst du aber auch, dass das Komma von der Methode document.write() nicht übergeben wurde, sondern eine Auswertung erfolgte. Statt 2,3 wurde 23 geschrieben.

Der Methode setInterval wird ein String übergeben, der mittels Stringverkettung gebildet wird.
Da der Kommaoperator in der Operatorenreihenfolge die kleinste Rangfolge hat, wird er natürlich auch zuletzt ausgeführt.

Dein Aufruf:
deinString="zeige_zu("+nr,anzahl+")";

erzeugt den String deinString="zeige_zu("+nr;

Der Kommaoperator bleibt unbeachtet (wird aber interpretiert!), da keine Anweisung zur Verarbeitung des Rückgabewertes besteht.

Spielen wir mal einwenig mit dem was passiert:

alert("zeige_zu("+nr,anzahl+")");

erzeugt einen unvollständigen Aufruf

im nächsten Aufruf klammere ich den Kommaoperator ein

alert("zeige_zu("+(nr,anzahl)+")");

jetzt wird zuerst der Kommaoperator ausgewertet und der gibt 3 zurück, da in der Variablen Anzahl 3 gespeichert ist. Da für diesen Rückgabewert jetzt eine Verarbeitungsanweisung existiert,
(+(nr,anzahl) heißt ja, verkette den Rückgabewert des Operators) erfolgt ein gültiger Funktionsaufruf.

Die Variable nr wurde aber endgültig überschrieben. Möchtest du sie mit einbringen und trotzdem den Operator Komma verwenden könnte dein Aufruf so aussehen:

alert("zeige_zu("+nr+(nr,anzahl)+")");

jetzt wird zusätzlich auch die Variable nr mitverkettet.

Das war es aber gar nicht, was du wolltest. Du wolltest, das das Komma erst in deiner Funktion verwendet wird.
Aus diesem Grund mußt du ihn auch direkt als String in die Verkettung eingebe, damit der Operator nicht interpretiert, sondern übergeben wird.

alert("zeige_zu("+nr+","+anzahl+")");

Wie du siehst, sind solche Feinheiten in dem Verständnis der Materie begründet. Normalerweise reicht es schon, sich genau zu vergegenwärtigen, was passiert wann wo. Dabei ist es immer hilfreich sich die einzelnen Werte oder Aufrufe mittels alert ausgeben zu lassen. Dann erkennt man rasch wo die Probleme herkommen.

Viele Grüße

Antje