tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von CPoly
  • 1 Beitrag von CPoly
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
194
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Netzwerkidi Netzwerkidi ist offline Mitglied Gold
    Registriert seit
    Oct 2010
    Beiträge
    237
    Blog-Einträge
    1
    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)
     

  2. #2
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    setTimeout, der Klassiker :-D

    Zitat Zitat von Netzwerkidi Beitrag anzeigen
    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".

    Code javascript:
    1
    2
    3
    
    setTimeout(function() {
        msg('BACON');
    }, 2000);
    Netzwerkidi bedankt sich. 

  3. #3
    Netzwerkidi Netzwerkidi ist offline Mitglied Gold
    Registriert seit
    Oct 2010
    Beiträge
    237
    Blog-Einträge
    1
    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...

    Mal drüber schlafen.

    LG
     

  4. #4
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    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"
    Netzwerkidi bedankt sich. 

Ähnliche Themen

  1. DB Aufruf in einer Funktion
    Von Tekkion im Forum Visual Basic 6.0
    Antworten: 0
    Letzter Beitrag: 12.03.09, 10:29
  2. Funktion in Funktion mit setTimeout
    Von Just_Bob im Forum Javascript & Ajax
    Antworten: 10
    Letzter Beitrag: 17.09.08, 18:24
  3. Funktion aufruf
    Von Pantalaimon im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 13.06.07, 10:42
  4. Problem setTimeout in eigener Funktion
    Von stefanstfnh im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 24.02.05, 04:28
  5. Funktion per setTimeout in sich selber aufrufen
    Von Schaelle im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 18.12.04, 18:17