Aufruf von Funktion in Funktion mit setTimeout

  • Themenstarter Themenstarter Netzwerkidi
  • Beginndatum Beginndatum
N

Netzwerkidi

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:
<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>
 
Zuletzt bearbeitet von einem Moderator:
setTimeout, der Klassiker :-D

da versucht man, "a good boy" zu sein und den Javascript-Namensraum nicht zu verschmutzen, und dann ist es auch wieder nicht recht ;-)

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

Javascript:
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.

Die Lösung ist es, setTimeout eine Anonyme Funktion zu übergeben, um sozusagen den aktuellen Scope zu "konservieren".

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.

Hm...:confused:

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/publications/standards/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"
 

Neue Beiträge

Zurück