Nico Lehmann: window.setInterval("checker(id,name);",5000);

Hallo,

in einer Funktion soll ein Intervall aufgerufen werden:

function neufenster(id,name)

{

daten[id] = new Object();

daten[id]["objektid"] = window.open("popup.htm", name, "width=370,height=270");

window.setInterval("checker(id,name);",5000);

}

Der Intervall wird aber nicht aufgerufen, die 2 Variablen sind aber gesetzt. Müssen diese ev. anders geklammert werden?

Danke,
Nico Lehmann

  1. Hallo,

    function neufenster(id,name) {
    ...
    window.setInterval("checker(id,name);",5000);
    }

    Meine Vermutung: Zu dem Zeitpunkt an dem der String "checker(id, name)" vom eingebauten Parser wie eval behandelt wird, ist die Funktion schon wieder verlassen. Konsequenterweise kann er die Variablen id und name nicht auflösen, weil diese nur lokal in der Funktion existierten.

    Die Lösung: Closures mit einer anonymen Funktion, in der der checker-Aufruf versteckt wird. Das sähe dann so aus:

    window.setInterval(function () { checker(id, name); }, 5000);

    setInterval kriegt hier ein richtiges Funktionsobjekt übergeben, nicht nur einen Textstring. Und wenn man (anonyme) Funktionen innerhalb von Funktionen definiert haben diese den Vorteil, dass sie weiterhin Zugriff auf Variablen der sie umgebenden äußeren Funktion haben - auch wenn die innere Funktion aus der äußeren Funktion zurückgegeben und die äußere Funktion verlassen wurde. Im Gegensatz zu string haben diese also ein Gedächtnis. Fachterminus dafür: Closure.

    Weiterer Vorteil: Im Gegensatz zur String-Variante wird das Functions-Objekt schon beim erstmaligen Einlesen des Skriptes erstellt. Das ist effizienter, sagen Browser-Hersteller.

    Tim