Struppi: DIV langsam verschwinden lassen und wieder herstellen

Beitrag lesen

fkt a()
{
  count++;
  if (x=true)
    setTimeout(ptr(a()),2000)
  //und a() ist hier eben NICHT zwingend zuende:
  alert("Ich bin die aktuell lebende Rekursionsinstanz: " + count);
  count--;
}

Das ist keine Rekursion!

fkt setTimeout(fktptr toA, sleepTime)
{
   sleep sleepTime;
   call toA; //ruft a() erneut auf
}

Das ist eine.

Man kann weder leugnen, dass die einzelnen Funktionsaufrufe
vor Bestätigung des alerts noch leben, noch, dass ein rekursiver Aufruf erfolgt - es werden immmer mehr alerts, und diese entstehen dadurch, dass a() sich  selbst (über den Umweg setTimeout()) aufruft.

genau wie
while(1) { alert('');

Eine Rekursion ist es wenn die Funktion in ihrem eigenen Gültigkeitsbereich sich selbst aufruft. Dadruch werden alle lokalen Variabeln auf den Stack geschoben und nach dem Aufruf Der Funktion geht es weiter. Deshalb kommt es ab einer bestimmten Tiefe der Rekursion auch zum Stackoverflow und diese Methode ist daruch langsam und speicherfressend.

Probier es mal aus:

  
function A() { A(); }  
  
A();  

Wie lautet die Fehlermeldung?
Versuch die mal mit einem Timeout zu bekommen, es wird dir nicht gelingen.

Es müssen also nur lokale Variabeln zur Geltung kommen. z.b. kann so ein Array (s. Beispiel) aufgebaut werden, dass am Ende zurückgegeben wird. Das ist bei deiner Methode nicht möglich, da es keine Rekursion ist.

Hier mal der direkte Vergleich:

<form>  
<textarea rows=10 cols=50 name="out"></textarea>  
</form>  
<script type="text/javascript" >  
var o = document.forms[0].out;  
o.value = '';  
function D(txt){  
 if(!o) return;  
 o.value += txt + '\n';  
}  
  
var counter = 0;  
function Rekursion(depth, container) {  
 if(!container) container = [];  
 if(!depth) return;  
 container.push('depth:' + depth + ' call: ' + counter++);  
  
 Rekursion( depth - 1, container);  
 return container  
}  
counter = 0;  
function keineRekursion(depth, container) {  
 if(!container) container = [];  
 if(!depth) return;  
 container.push('depth:' + depth + ' call: ' + counter++);  
  
 window.setTimeout( function() {  
  Rekursion( depth - 1, container);  
 }, 1  
 );  
 return container  
}  
function start () {  
var a1 = keineRekursion(10);  
var a2 = Rekursion(10);  
D( 'keine Rekursion:\n' + a1.join('\n') )  
D( 'Rekursion:\n' + a2.join('\n') )  
}  
start();  
  
</script>  

Die entstehenden alerts verdeutlichen übrigens die entstehende Kette...

Nein, nur den wiederholten aufruf und die Ausgabe einer globalen Variabel, die gibt es in der Rekursion nicht unbedingt.

Struppi.