Benjamin Mollenhauer: "too much recursion"

Hallo,

ich hab folgendes Problem, an dem ich nun schon seit einer Stunde rumhaenge:

"JavaScript Error: too much recursion" nennt sich mein Problem und wird verursacht durch folgenden Code:
  
function animateObj () {
MachIrgendWas_wasichgeradegekillthab();
setTimeout( eval("this.Animate();"), this.Interval );
}

wobei gilt: "this.Animate = animateObj;". Das ganze wird gestartet durch einen Aufruf dieser Funktion (Wechsler.Animate();).
Der Interval liegt bei 300, hab aber auch schon andere Werte ausprobiert - gl. Ergebnis. IE stürtzt bei dem Script total ab.

Wer kann mir helfen? Ist ja bestimmt wieder trivial...

Was bedeutet 'too much recursion'? Bzw. was soll das in diesem Zusammenhang? Die Funktion wird aufgerufen, arbeitet MachIrgendwas ab dann wird gewartet, 3s - und dann wieder von vorne. Was ist den hier rekursiv?

Vielen Dank,

Benni
  1. Bevor oder waehrend dem Aufruf von
    setTimeout( eval("this.Animate();"), this.Interval );
    wird die aufrufende Funktion (animateObj) aufgerufen.
    Eine andere Moeglichkeit faellt mir gerade nicht ein. (Vielleicht, weil ich mich erst seit gestern mit JS befasse :-).

    mfg
    Felix

    1. HiHi

      Felix dürfte wohl recht haben. Hab' das ganze schnell mal gecheckt.
      Mein NS 4.6 bricht nach ein paar hundert Durchläufen mit der erwähnten Meldung ab.

      Mir fällt dazu eigentlich nur eine einfache Lösung ein:

      Da ja die betreffende Funktion nicht solderlich lang sind, kannst du sie ja 2x, jeweils unter anderem Namen, notieren und dann von der einen aus die andere aufrufen und umgekehrt.
      Zwar nicht sonderlich elegant, aber es funzt!

      Hoffe, ich konnte helfen ... (*g*)

      Lorenz

      Bevor oder waehrend dem Aufruf von
      setTimeout( eval("this.Animate();"), this.Interval );
      wird die aufrufende Funktion (animateObj) aufgerufen.
      Eine andere Moeglichkeit faellt mir gerade nicht ein. (Vielleicht, weil ich mich erst seit gestern mit JS befasse :-).

      mfg
      Felix

      1. Da ja die betreffende Funktion nicht solderlich lang sind, kannst du sie ja 2x, jeweils unter anderem Namen, notieren und dann von der einen aus die andere aufrufen und umgekehrt.
        Hoffe, ich konnte helfen ... (*g*)

        Danke, ich hab deine Msg nicht verstanden, aber sie hat mich inspiriert.
        (s. Reply auf "Andreas Bierhals"s Msg.)

        Leider zerstört das meine objektorientierten Ansätze.

        Gruß,

        Benni

  2. Moin,

    function animateObj () {

    »»  MachIrgendWas_wasichgeradegekillthab();
    »»  setTimeout( eval("this.Animate();"), this.Interval );

    }  
    wobei gilt: "this.Animate = animateObj;". Das

    Das Problem ist wohl die Zeile mit setTimeout... Normalerweise übergibt man setTimeout einen String, der den Funktionsaufruf enthält. So wie Du es gemacht hast, mit setTimeout(eval(<String>),...) wird die Funktion aber schon aufgerufen, *bevor* sie als Parameter in setTimeout eingeht. Da es sich um die selbige Funktion handelt, gibt es natürlich eine Endlosrekursion.
    Daher... warum nicht einfach

    setTimeout("this.Animate()", this.interval);

    ?

    Viele Grüße

    Andreas

    1. Daher... warum nicht einfach

      »   setTimeout("this.Animate()", this.interval);

      Deswegen: "this.Animate is not a function."
      Mit der relativen Adressierung kann setTimeout nix anfangen.

      Ich hab's nun so ähnlich gemacht wie Felix Rabe gesagt hat.

      function AnimMain() { ...Wechsler... }
      [...]
      Wechsler.StartAnim();
      AnimMain();

      Leider ist dann mein objektorientiertes Design hinfällig.

      Gruß,
         Benni