setTimeout in Objekten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • setTimeout in Objekten

    Manchmal treibt mich diese Sprache einfach in den Wahnsinn. Also das hier funktioniert reibungslos:
    PHP-Code:
    function bla()
    {
      function 
    blubb()
      {
        
    blubber();
      }
      function 
    blubber()
      {
        ...
      }

    aber hier bekomme ich die Meldung, dass blubber nicht definiert ist:

    PHP-Code:
    function bla()
    {
      function 
    blubb()
      {
        
    window.setTimeout('blubber()'2000);
      }
      function 
    blubber()
      {
        ...
      }

    Ist das wieder eine dieser Seltsamkeiten bei JavaScript oder habe ich etwas übersehen?

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

  • #2
    Zitat von Kropff Beitrag anzeigen
    Manchmal treibt mich diese Sprache einfach in den Wahnsinn. Also das hier funktioniert reibungslos:
    PHP-Code:
    function bla()
    {
      function 
    blubb()
      {
        
    blubber();
      }
      function 
    blubber()
      {
        ...
      }

    aber hier bekomme ich die Meldung, dass blubber nicht definiert ist:

    PHP-Code:
    function bla()
    {
      function 
    blubb()
      {
        
    window.setTimeout('blubber()'2000);
      }
      function 
    blubber()
      {
        ...
      }

    Ist das wieder eine dieser Seltsamkeiten bei JavaScript oder habe ich etwas übersehen?

    Peter

    ich tippe ungetestet auf

    Code:
    window.setTimeout('bla.blubber()', 2000);
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      Zitat von unset Beitrag anzeigen
      ich tippe ungetestet auf
      Code:
      window.setTimeout('bla.blubber()', 2000);
      Nee, hab ich schon probiert. Die selbe Meldung "blubber" ist not a function". Auch ein this.blubber bringt nichts.

      peter
      Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
      Meine Seite

      Kommentar


      • #4
        Zitat von Kropff Beitrag anzeigen
        Nee, hab ich schon probiert. Die selbe Meldung "blubber" ist not a function". Auch ein this.blubber bringt nichts.
        Das Objekt "bla" muss natürlich vorher instanziert werden.

        PHP-Code:
        function bla()
        {
          function 
        blubb()
          {
            
        window.setTimeout('foobar.blubber()'2000);
          }
          function 
        blubber()
          {
            ...
          }
        }  

        var 
        foobar = new bla(); 

        Kommentar


        • #5
          Zitat von h3ll Beitrag anzeigen
          Das Objekt "bla" muss natürlich vorher instanziert werden.
          Ist natürlich schon geschehen. Die "private" Methode blubb wird z.B. über eine "öffentliche" aufgerufen. Das sieht dann vom Prinzip her so aus:
          PHP-Code:
          function bla()
          {
            
          this.jodelbla = function ()
            {
              
          blubb();
            }
            function 
          blubb()
            {
              
          // funzt nicht
              
          setTimeout('this.blubber()'1000);
              
          // auch nicht
              
          setTimeout('blubber()'1000);
              
          // das eh nicht
              
          setTimeout('laber.blubber()'1000);
            }
            function 
          blubber()
            {
              
          alert ('hallo');
            }
          }  

          window.onload = function ()
          {
            var 
          laber = new bla();  
            
          laber.jodelbla();  

          Außerdem weiß das Objekt bla doch nichts von der Referenz laber. So kann/sollte das doch nicht funktionieren.

          Peter
          Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
          Meine Seite

          Kommentar


          • #6
            Wenn du das in Anführungszeichen setzt, hat es den gleichen Effekt wie eval.

            PHP-Code:
            window.setTimeout(this.blubber2000); 
            Aber Vorsicht: Wenn ich mich jetzt nicht irre, zeigt this dann innerhalb der Funktion blubber auf das Window-Objekt, weil du quasi die Funktion an sich (=das Funktionsobjekt) übergibst.
            hopka.net!

            Kommentar


            • #7
              setTimeout läuft doch im globalen Scope, da ist nix mit Zugriff auf die Funktion. Allerdings akzeptiert setTimeout auch eine Funktion anstelle einer Zeichenkette. Lösung ist also:
              PHP-Code:
              function bla() {
                
              this.blubb=function(){
                  
              window.setTimeout(blubber2000);
                }
                function 
              blubber(){
                  
              alert('blubber');
                }
              }

              var 
              b=new bla()
              b.blubb() 

              Kommentar


              • #8
                Also folgender Code läuft bei mir. Es gibt zwar noch eine Meldung à la "useless setTimeout call (missing quotes around argument?)" aber es funktioniert.
                PHP-Code:
                function bla()
                {
                  
                this.jodelbla = function ()
                  {
                    
                blubb();
                  }
                  function 
                blubb()
                  {
                    
                setTimeout(blubber(), 1);
                  }
                  
                  function 
                blubber ()
                  {
                    
                alert ('hallo');
                  }
                }  

                window.onload = function ()
                {
                  var 
                laber = new bla();  
                  
                laber.jodelbla();  

                Warum es bei meiner Programmierung noch nicht klappt, kann ich derzeit nicht sagen. Sobald ich die Infos dazu habe, melde ich mich.

                Danke an alle
                Peter
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar


                • #9
                  Kropff, das ist doch Blödsinn. Überleg dir nochmal gut, was folgender Codeabschnitt macht
                  PHP-Code:
                  setTimeout(blubber(), 1); 
                  Richtig, die Funktion ausführen und den Rückgabewert an setTimeout übergeben Das "funktioniert" kommt dir nur so vor, da dieser Aufruf bestimmt auch nur gefühlte 1ms benötigt. Und die Warnung ist natürlich vollkommen korrekt, der Aufruf macht so keinen Sinn.

                  Kommentar


                  • #10
                    Zitat von PHP-Desaster Beitrag anzeigen
                    Richtig, die Funktion ausführen und den Rückgabewert an setTimeout übergeben Das "funktioniert" kommt dir nur so vor, da dieser Aufruf bestimmt auch nur gefühlte 1ms benötigt. Und die Warnung ist natürlich vollkommen korrekt, der Aufruf macht so keinen Sinn.
                    Es ist spät, ich bin alt und brauche meine Ruhe. Schaue mir das morgen Abend noch mal genau an. Man sollte halt nicht nach 20Uhr noch wie ein Bekloppter JavaScript programmieren. Das kann nicht gut gehen . Außerdem ist SelfHTML in der Beziehung keine gute Wahl. Und das JavaScript-Handbuch leider auch nicht. Außerdem habe ich ehrlich gesagt noch nie mit setTimeout in Objekten gearbeitet. Ist für mich also Neuland.

                    Peter

                    PS: Und zusätzlich muss ich gerade meinen Auftritt gegen "********************attacken" absichern. Ist ein ein wenig zu viel auf einmal.
                    Zuletzt geändert von Kropff; 15.06.2009, 21:48.
                    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                    Meine Seite

                    Kommentar


                    • #11
                      Code:
                      function bla() {
                        var thisInstance = this;
                      
                        function blubb() {
                          window.setTimeout(thisInstance.blubber, 2000);
                        }
                      
                        function blubber() {
                          ...
                        }
                      }



                      Zitat von hopka
                      Aber Vorsicht: Wenn ich mich jetzt nicht irre, zeigt this dann innerhalb der Funktion blubber auf das Window-Objekt, weil du quasi die Funktion an sich (=das Funktionsobjekt) übergibst.
                      Auch das lässt sich mit Closures vermeiden.
                      SELFHTML Artikel: Organisation von JavaScripten
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        Zitat von wahsaga Beitrag anzeigen
                        Auch das lässt sich mit Closures vermeiden.
                        SELFHTML Artikel: Organisation von JavaScripten
                        JavaScript ist einfach nur abartig.

                        Kommentar


                        • #13
                          Zitat von h3ll Beitrag anzeigen
                          JavaScript ist einfach nur abartig.
                          Sag ich doch . Vor Allem abends nach der Arbeit, wenn die Konzentration nachlässt.

                          Peter
                          Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                          Meine Seite

                          Kommentar


                          • #14
                            versuch mal folgendes:

                            [COLOR=#000000][COLOR=#0000CC]window[/COLOR][COLOR=#006600].[/COLOR][COLOR=#0000CC]setTimeout[/COLOR][COLOR=#006600](function(){ blubber();}[/COLOR][COLOR=#006600], [/COLOR][COLOR=#0000CC]2000[/COLOR][COLOR=#006600]); [/COLOR][/COLOR]

                            klappt bei sowas "fast" immer

                            mfg jura
                            [FONT=Comic Sans MS]Hab ich dir erfolgreich geholfen? Wenn ja, dann hilf mir auch und bewerte mich auf php-resource.de[/FONT]
                            [FONT=Comic Sans MS]
                            [/FONT][FONT=Comic Sans MS]Go and help me[/FONT]

                            Kommentar


                            • #15
                              Für die Übergabe des Scopes kannst du auch sowas benutzen (auch in vielen Javascript Frameworks angewandte Methode):
                              Code:
                              Function.prototype.scope = function(){
                               var instance = this, length = arguments.length, args = new Array(), object;
                               while(length--){
                                args[length] = arguments[length];
                               }
                               object = args.shift();
                               return function(){
                                return instance.apply(object, args);
                               }
                              }
                              function bla(){
                               this.a = "Test";
                               function blub(){alert(this.a);}
                               this.blo = function(){
                                setTimeout(blub.scope(this), 1000);
                               }
                              }
                              blob = new bla;
                              blob.a = "It works";
                              blob.blo();

                              Kommentar

                              Lädt...
                              X