p@t: falsche variablenübergabe! warum?

hallo zusammen,

nach reichlich recherche im archiv und selfhtml, muss ich nun doch hier posten.
ich habe mehrere vaarianten der umklammerung, bzw. andere sonderzeichen
schon versucht, aber nichts wollte mir die werte der variablen an die nächste
funktion übergeben

aufruf sieht folgendermassen aus:

mytimer = window.setInterval ("zeige_zu("+nr,anzahl+")",100);

wo liegt der fehler?
nr und anzahl sollen übergeben werden.

wer kann helfen!

grüße
pat

  1. Hallo p@t,

    aufruf sieht folgendermassen aus:

    mytimer = window.setInterval ("zeige_zu("+nr,anzahl+")",100);

    ist nur eine Kleinigkeit:

    mytimer = window.setInterval ("zeige_zu("+nr+","+anzahl+")",100);

    auch das Komma muß extra gesetzt werden.

    Viele Grüße

    Antje

    1. hallo Antje,

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

      gruß
      pat

      1. 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

        1. Hallo Antje,

          das war eine super abhandlung. habe auch deine besipiele ausprobiert, um mir die
          problematik noch einmal zu verinnerlichen.

          ich denke dass ich solche fehler in zukunft ein bischen differenzierter angehen
          werde als bisher.

          nochmals danke.

          gruß
          p@

        2. Moin Antje!

          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.

          IMHO muss man einfach die Syntaxregeln von JavaScript kennen, der Rest folgt ganz logisch daraus.

          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.

          Bis hierher ist alles ok. Aber was Du dann schreibst, laesst mich daran zweifeln, ob Du ueberhaupt die Basisregeln der JavaScript-Syntax kennst.

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

          Das hat eigentlich nichts mit dem, was p@t schrieb, zu tun, ausser dass es aehnlich aussieht.

          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.

          Das ist Schwachsinn. JavaScript-Methoden gehen ueberhaupt nicht mit irgendwelchen Operatoren um. Sie nehmen die Argumente, die sie uebergeben bekommen, und verarbeiten diese in der vorgesehenen Weise. Richtig ist, dass der Kommaoperator den rechten von zwei Ausdruecken zurueckgibt. Falsch ist, dass ein Funktionsaufruf ueberhaupt was mit dem Kommaoperator zu tun hat. In einem Funktionsaufruf trennt das Komma schlicht und einfach die einzelnen Argumente voneinander, nichts weiter. Wuerde es sich wirklich um den Kommaoperator handeln, muesste ja ein Aufruf wie
            alert("a", "b");
          das b anzeigen und nicht das a.

          Zu beachten ist dabei, dass man in JS einer Funktion soviele Argumente uebergeben kann, wie man will, es erfolgt da keine Pruefung wie bei einer richtigen Programmiersprache. Ob sich die aufgerufene Funktion um die weiteren Argumente kuemmert, liegt aber in ihrem Ermessen.

          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.

          Wiederum Schwachsinn. alert() interpretiert gar nichts (siehe oben). Es nimmt einfach den ersten uebergebenen Parameter und zeigt diesen an. Im uebrigen widersprichst Du Dir selbst. Folgt man Deiner Erklaerung, muesste alert() den zweiten anzeigen.

          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.

          Was soll ich sagen - Schwachsinn. document.write() schreibt einfach alle Argumente, die es bekommt, hintereinander weg. Im Gegensatz zu alert(), welches sich nur um den ersten kuemmert.

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

          Nein, das erzeugt einen Syntaxfehler.

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

          Haeh? Links steht doch eine Variable, an die das zugewiesen werden soll.

          Spielen wir mal einwenig mit dem was passiert:
          alert("zeige_zu("+nr,anzahl+")");
          erzeugt einen unvollständigen Aufruf

          Was heisst unvollstaendig? Hier werden zwei Argumente an alert() gegeben, von denen dann das erste angezeigt wird, naemlich "zeige_zu("+nr.

          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.

          Das stimmt sogar mal.

          Da für diesen Rückgabewert jetzt eine Verarbeitungsanweisung existiert,

          ???  Da steht einfach der geklammerte Ausdruck (nr,anzahl), und da gibt natuerlich der Kommaoperator den rechten Wert zurueck.

          Die Variable nr wurde aber endgültig überschrieben.

          Haeh? Die ist unveraendert.

          [..]

          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.

          Wie wahr.

          Der Grund fuer das (Nicht-)Verhalten von setInterval war einfach, dass p@t dieser Funktion 3 Argumente uebergeben hat, was deutlich wird, wenn man nach jedem abtrennenden Komma mal etwas Platz laesst:
              window.setInterval ("zeige_zu("+nr,  anzahl+")",  100);
          Da setInterval aber nur 2 Argumente erwartet, wird es das dritte ignorieren und versuchen, das zweite als Zeitangabe zu interpretieren. Was dabei rauskommt, weiss ich nicht, es koennte 3 Millisekunden sein, wenn anzahl==3. Da aber der erste String (etwas wie "zeige_zu(2") kein gueltiges JS-Statement ergibt, sondern einen Syntaxfehler, wird eben gar nichts getan.

          Die richtige Loesung hast Du ja schon genannt, ich denke die muss ich nicht noch erklaeren.

          So long