PoWl89: Mit setTimeout funktion im eigenen Objekt aufrufen

Hi!

Aus folgendem Code sollte mein Problem hervorgehen:

blub = new test();

function test()
{
  this.innerfunc = function(id)
  {
    ...

setTimeout('this.innerfunc('+id+')', 1000);
  }
}

Ich würde gerne nach einer gewissen Zeit mit setTimeout die Funktion innerfunc des Objekts blub nochmal aufrufen. Normalerweise geschieht sowas von ausserhalb mit z.B. blub.innerfunc(3); Allerdings weiß die Funktion innerfunc selbst nicht, wie der Zeiger auf das Objekt, in dem sie sich befindet ("blub"), heißt.

Wieso hat damals niemand an eine funktion wie sleep(1000); gedacht? dann könnte man das einfach in eine while-schleife packen...

lg PoWl

  1. Hi,

    function test()
    {
      this.innerfunc = function(id)
      {
        ...

    setTimeout('this.innerfunc('+id+')', 1000);
      }
    }

    setTimeout evaluiert hier einen String. Diese Evaluierung hat dann keinen Bezug mehr zu irgendwas, bzw. nur noch zum globalen Kontext. this zeigt dann auf window (bin mir ziemlich sicher).

    Ich würde an setTimeout lieber einen Funktionspointer übergeben, als einen String. Dann hat man weniger Probleme, und es ist performanter:

    var s = this;
    setTimeout(function()
    {
    s.innerfunc(id);
    }, 1000);

    oder aber noch besser, du merkst die den die Funktion in einer Variablen, und rufst diese dann auf:

    setTimeout(arguments.callee.call(this, id), 1000); // geht das so?? habs nicht getestet.

    oder
    var callee = arguments.callee;
    setTimout(function()
    {
    callee(id);
    }, 1000);

    Gruß!

    1. setTimeout evaluiert hier einen String. Diese Evaluierung hat dann keinen Bezug mehr zu irgendwas, bzw. nur noch zum globalen Kontext. this zeigt dann auf window (bin mir ziemlich sicher).

      Ja, ich weiß, war nur ein Beispiel wie das sinngemäß funktionieren sollte :-)

      Ich würde an setTimeout lieber einen Funktionspointer übergeben, als einen String. Dann hat man weniger Probleme, und es ist performanter:

      var s = this;
      setTimeout(function()
      {
      s.innerfunc(id);
      }, 1000);

      Danke, das funktioniert! So ähnlich habe ich es auch schon probiert, allerdings habe ich anstelle von s.innerfunc einfach this.innerfunc genommen.

      Wieso geht das so? wird somit irgendwie ein zeiger aufs objekt erstellt?

      lg PoWl

      1. Hi,

        var s = this;
        setTimeout(function()
        {
        s.innerfunc(id);
        }, 1000);

        Danke, das funktioniert! So ähnlich habe ich es auch schon probiert, allerdings habe ich anstelle von s.innerfunc einfach this.innerfunc genommen.

        Wieso geht das so? wird somit irgendwie ein zeiger aufs objekt erstellt?

        Du merkst dir _außerhalb_ der anonymen Funktion den Context (s = this). Diese anonyme Funktionen wird im globalen Kontext aufgerufen, daher ist innen this == window.

        Gruß!

      2. Wieso geht das so? wird somit irgendwie ein zeiger aufs objekt erstellt?

        Nein, eine lokale Referenz, Zeiger gibt es in JS nicht.

        Struppi.