Marco: Parameterübergabe mit SetTimeout()

Hallo,
ich habe ein kleines Problem, in der Dokumentation zur setTimeout-Methode, wird die Möglichkeit einer Parameterübergabe mittel Zeichenkettenverknüpfung erwähnt. Ich habe allerdings keine Ahnung wie ich einen Parameter oder eine Variable so an die aufgerufene Funktion übergeben kann, dass sie dort benutzbar ist.

  1. Hallo Marco.

    ich habe ein kleines Problem, in der Dokumentation zur setTimeout-Methode, wird die Möglichkeit einer Parameterübergabe mittel Zeichenkettenverknüpfung erwähnt. Ich habe allerdings keine Ahnung wie ich einen Parameter oder eine Variable so an die aufgerufene Funktion übergeben kann, dass sie dort benutzbar ist.

    Wie wäre es zum Beispiel folgendermaßen?

    var foo = 'Ein kleiner Satz ';  
    var bar = 'mit einer Ergänzung.';  
      
    setTimeout('var a = "' + foo + '"; var b = "' + bar + '"; ausgeben(a, b)', 1000);  
      
    function ausgeben(a, b) {  
      alert(a + b);  
    }
    

    Wichtig ist, dass die Zeichenkette, die als erster Parameter an setTimeout übergeben wird, interpretiert wiederum gültiges JavaScript ergibt.

    setTimeout('var a = ' + foo + '; var b = ' + bar + '; ausgeben(a, b)', 1000);

    Dies hier wäre also falsch, da hier die Anführungszeichen um die Werte der Variablen a und b fehlen, das Wort „Ein“ würde also als undeklarierte Variable aufgefasst.

    Kürzer und sicher auch flexibler ginge es natürlich auch so:

    setTimeout('ausgeben("' + foo + '", "' + bar + '")', 1000);

    Einen schönen Freitag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Hallo,

      setTimeout('ausgeben("' + foo + '", "' + bar + '")', 1000);

      Hm mir drängt sich ne Frage auf, ... ähm wird nach 1000 Milisekunden da einfach eval(string) aufgerufen?

      Grüße
      Jeena Paradies

      1. Hallo Jeena.

        setTimeout('ausgeben("' + foo + '", "' + bar + '")', 1000);

        Hm mir drängt sich ne Frage auf, ... ähm wird nach 1000 Milisekunden da einfach eval(string) aufgerufen?

        Das habe ich mich auch gefragt, da es wohl nahe liegt.

        Zumindest dürfte der Interpreter hier genau dasselbe machen, wie bei eval.

        „Evaluates an expression or calls a function …“
        [DevEdge window.setTimeout]

        Einen schönen Freitag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
        [HTML Design Constraints: Logical Markup]
        1. Hallo,

          Das habe ich mich auch gefragt, da es wohl nahe liegt.
          Zumindest dürfte der Interpreter hier genau dasselbe machen, wie bei eval.
          „Evaluates an expression or calls a function …“
          [DevEdge window.setTimeout]

          Dann könnte man da durchaus auch mit Clousures arbeiten um eval() in einen bestimmten context zu bringen?

          Grüße
          Jeena Paradies

          1. Hallo,

            Zumindest dürfte der Interpreter hier genau dasselbe machen, wie bei eval.

            Ja.

            „Evaluates an expression or calls a function …“
            [DevEdge window.setTimeout]

            Dann könnte man da durchaus auch mit Clousures arbeiten um eval() in einen bestimmten context zu bringen?

            Die Übergabe von Parametern an eine mit setTimeout verzögert aufgerufene Funktion ist ein Fall, bei dem man *immer* eine Closure verwenden sollte. Dann braucht man sich nicht darüber Gedanken machen, wie man irgendwelche Variablen in Strings zusammenbastelt, die dann eval()-artig ausgeführt werden.

            /* Funktions-Kontext */
            var foo = "a", bar = "b"; // lokale Variablen
            window.setTimeout(function () { ausgeben(foo, bar); }, 1000);

            Mathias

            1. Die Übergabe von Parametern an eine mit setTimeout verzögert aufgerufene Funktion ist ein Fall, bei dem man *immer* eine Closure verwenden sollte. Dann braucht man sich nicht darüber Gedanken machen, wie man irgendwelche Variablen in Strings zusammenbastelt, die dann eval()-artig ausgeführt werden.

              /* Funktions-Kontext */
              var foo = "a", bar = "b"; // lokale Variablen
              window.setTimeout(function () { ausgeben(foo, bar); }, 1000);

              Nur als Ergänzung: das läuft dann aber nur in Browser >IE 4 und >NC 4
              Wobei das mittlerweile vernachlässigbar sein dürfte, da diese Browser mit den wenigstens Skripten (und CSS) klar kommen.

              Struppi.