2Danke
ERLEDIGT
JA
JA
ANTWORTEN
3
3
ZUGRIFFE
194
194
EMPFEHLEN
-
Hallo,
da versucht man, "a good boy" zu sein und den Javascript-Namensraum nicht zu verschmutzen, und dann ist es auch wieder nicht recht
Wo ist mein Fehler? Ich will doch nur per timeout diese msg-Function ausführen.
Danke + Grüße
Idi
HTML-Code:<html> <head> </head> <body> <script type="text/javascript"> function myFunc () { function msg(t) { t=t||'TESTMELDUNG'; alert(t); } //msg('TESTMELDUNG'); // Das klappt. setTimeout(msg,2000); // Das klappt auch. //setTimeout("msg('TESTMELDUNG');",2000); // Das klappt nicht, diese Variante brauche ich aber. } myFunc(); </script> </body> </html>
Geändert von Netzwerkidi (18.10.11 um 15:19 Uhr)
-
setTimeout, der Klassiker :-D
Genau das ist das Problem
. setTimeout wird im window-scope ausgeführt (eine Art eval) und da gibt es die Funktion "msg" nicht. Die eine Variante funktioniert deshalb, weil du keinen String übergibst, sondern eine Referenz zur Funktion.
Die Lösung ist es, setTimeout eine Anonyme Funktion zu übergeben, um sozusagen den aktuellen Scope zu "konservieren".
Code javascript:1 2 3
setTimeout(function() { msg('BACON'); }, 2000);
-
Du bist sooooo gut....
Das mit der Stringübergabe ist korrekt. Es werden eine ganze Menge Parameter übergeben. Das war nur der Test.
D. h. ich bleibe in meinem Namensraum, aber intern geht JS dann auf Window-Ebene mit dieser neutralen Funktion, nimmt die Parameter mit, und wenn der Timeout zieht, nimmt er der Parameter mit? Ne, geht ja nicht, auf die Funktion kann man ja von außen nicht zugreifen.Die Lösung ist es, setTimeout eine Anonyme Funktion zu übergeben, um sozusagen den aktuellen Scope zu "konservieren".
Hm...
Mal drüber schlafen.
LG
-
Du übergibst die Referenz auf die anonyme Funktion. Also ist es schon mal kein Problem auf Window Ebene diese auszuführen.
Auf die Funktion "msg" kann zugegriffen werden, weil zu dem Zeitpunkt und an dem Ort, wo die anonyme Funktion deklariert wurde, befand sich "msg" im zugreifbarem Bereich.
Wenn du es ganz genau willst, guck in die Spezifikation.
http://www.ecma-international.org/pu...s/Ecma-262.htm
Scope
A lexical environment that defines the environment in which a Function object is executed.Lexical Environments
A Lexical Environment is a specification type used to define the association of Identifiers to specific variables
and functions based upon the lexical nesting structure of ECMAScript code. A Lexical Environment consists of
an Environment Record and a possibly null reference to an outer Lexical Environment.
Nur weil du eine Referenz auf die Funktion irgendjemandem anderes übergibst, ändert sich ja nicht die "lexical environment"
Ähnliche Themen
-
DB Aufruf in einer Funktion
Von Tekkion im Forum Visual Basic 6.0Antworten: 0Letzter Beitrag: 12.03.09, 10:29 -
Funktion in Funktion mit setTimeout
Von Just_Bob im Forum Javascript & AjaxAntworten: 10Letzter Beitrag: 17.09.08, 18:24 -
Funktion aufruf
Von Pantalaimon im Forum Javascript & AjaxAntworten: 5Letzter Beitrag: 13.06.07, 10:42 -
Problem setTimeout in eigener Funktion
Von stefanstfnh im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 24.02.05, 04:28 -
Funktion per setTimeout in sich selber aufrufen
Von Schaelle im Forum Javascript & AjaxAntworten: 4Letzter Beitrag: 18.12.04, 18:17





Zitieren


Login





