fireglow: setTimeout() in Verbindung mit Variablen

Servus und schonmal Danke im vorraus üf ride Mühe.

Ich sitze nun schon seit über 5 Stunden an einem für mich lächerlichen Problem und kriege es einfach nicht hin. Ich habe keinen nerv mehr noch mehr Zeit zu verlieren.

Da ich niemand mit meinem Code langweilen will, formuliere ich es halbwegs allgemein.

Ich übergebe einer Funktion mehrere Werte.
Einen dieser Werte soll z.B. verzögert ausgegeben werden:

funtion x (y, z , e)
{
setTimeout("alert(z)", "2500");
}

Das macht er einfach nicht und ich vermute er versteht nicht ganz, dass z eine Variable ist (wobei es sich um einen Sting handelt der übergeben wurde).
Gebe ich die Variable direkt aus:

alert(z);

funktioniert es.

Verändere ich die Zeile so:

setTimeout("alert('123')", "2500");

funktioniert dies auch.

Das Problem ist aber, dass sich die Variable z ändern muss, wo ist der Formatierungsfehler?

  1. Hallo,

    das ist mal ein Schnellschuss von mir und ich mache auch sonst nix mit JS aber:

    funtion x (y, z , e)
    {
    setTimeout("alert("+z+")", "2500");
    }

    könnte JS zu verstehen geben das Du eine Variable einsetzen möchtest, vielleicht?

    Gruß AndreD

    1. funtion x (y, z , e)
      {
      setTimeout("alert("+z+")", "2500");
      }

      Danke für die schnelle Antwort, aber leider klappt dies nicht und ich habe das auch schon versucht.
      Hab jetzt sogar nur eine kleine HTML Datei, wo ich genau diesen Code ausprobiere, aber irgendwie klappt es in Verbindung mit einer Funktion nicht.

      Gehe ich z.B. so vor:

      var z = '1';
      setTimeout("alert(z);", "2500");

      funktioniert es.
      Aber wenn ich die Variable z per x(1,2,3) in die Funktion übergebe und es dann verzögert ausgeben will funktioniert es nicht.

  2. Hallo,

    funtion x (y, z , e)
    {
    setTimeout("alert(z)", "2500");
    }

    und so? Schlägt das auch fehl?

    funtion x (y, z , e)
      {
      foo=z;
      setTimeout("alert(foo)", "2500");
      }

    Grüße,

    Jochen

    --
    Heute schon gescribbelt?
    Scribbleboard
  3. Hallo,

    funtion x (y, z , e)

    ^
       function

    {
    setTimeout("alert(z)", "2500");
    }

    ^
                          Zahlenwert (ms)

    Das macht er einfach nicht und ich vermute er versteht nicht ganz, dass z eine Variable ist (wobei es sich um einen Sting handelt der übergeben wurde).

    Verwende diese Form:
    setTimeout(function(){alert(z);},2500);

    MfG, Thomas

  4. hi,

    funtion x (y, z , e)
    {
    setTimeout("alert(z)", "2500");
    }

    Das macht er einfach nicht und ich vermute er versteht nicht ganz, dass z eine Variable ist (wobei es sich um einen Sting handelt der übergeben wurde).

    doch, dass z eine variable sein soll, merkt "er" da noch (schließlich hast du keinen string notiert) - aber er weiß nicht, wo diese definiert sein soll.
    da z als parameter an die funktion x() übergeben wurde, steht z nur zur laufzeit dieser funktion zur verfügung. die funktion setzt den timeout, und ist danach mit ihrer arbeit fertig - y, z und e sind jetzt nicht mehr existent.

    so, und jetzt kommt nach 2,5 sekunden so ein freches alert daher, und sagt zum javascript-interpreter, "ey alter, gib mir doch mal eben den wert der variablen z, damit ich den dem typen vor dem bildschirm anzeigen kann!"
    darauf kann der interpreter natürlich nur mit einem schulterzucken (ggf. auch in form einer fehlermeldung) antworten, "hey kleines alert, ich habe keinen blassen schimmer, von was für einer variablen namens z du da eigentlich redest ..."

    Gebe ich die Variable direkt aus:
    alert(z);
    funktioniert es.

    natürlich, zu dem zeitpunkt ist die funktion x() noch nicht beendet, z existiert an dieser stelle noch - da kann der interpreter der anfrage des alert auch nachkommen, "hier hast du, kleines, der wert von z ist [...]".

    Verändere ich die Zeile so:
    setTimeout("alert('123')", "2500");
    funktioniert dies auch.

    natürlich, hier übergibst du ja ein fixes literal anstatt einer variablen.

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. Hallo,

      da z als parameter an die funktion x() übergeben wurde, steht z nur zur laufzeit dieser funktion zur verfügung. die funktion setzt den timeout, und ist danach mit ihrer arbeit fertig - y, z und e sind jetzt nicht mehr existent.

      Mit »nach der Laufzeit sind die Variablen weg« hat das Phänomen nichts zu tun. Selbst während die Funktion noch läuft, kann durch setTimeout ausgeführter Code nicht auf dessen Parameter zugreifen. Der Parameter liegt einfach im Scope der Funktion, der Code, der nach dem Timeout ausgeführt wird, wird im globalen Scope ausgeführt. Aus dem globalen Scope ist kein Zugriff auf die Parameter der Funktion möglich, sofern dessen Werte nicht wie etwa wie in https://forum.selfhtml.org/?t=100670&m=617143 in den globalen Scope überführt werden.

      Kleiner Test (Firefox und Konqueror):
      var f_anfang, timeout, f_ende;
      function stat (pstatus) {
       timeout = ((new Date()).getTime() - f_anfang) + "ms nach Start der Funktion\nVariable p war: " + pstatus;
      }
      function f (p) {
       window.setTimeout("stat(typeof p)", 0);
       f_anfang = new Date();
       alert("warte");
       f_ende = new Date();
      }
      f("foo");
      alert('Timeout feuerte: ' + timeout + ' \nEnde der Funktion ' + (f_ende - f_anfang) + 'ms nach dem Start beendet');

      Mathias