Hi ChrisB, Struppi!
Wie schon vorher:
function a()
{
window.setTimeout("a()",500);
alert("OK");
return;
}
a();
Ich verstehe schon, worin Ihr den Unterschied seht:
Mit window.setTimeout() erfolgt im Prinzip die Anweisung an den Interpreter (main execution process), einen Thread (nebenläufig) zu generieren, was in etwa so aussieht:
(*)
interpreter -->call <---(function a()){
interpreter <--callback: generate a Thread <---setTimeout("a()",500);
interpreter -->lookup funct.table, find function a() corresponding to "a()"
interpreter -->generate thread (a(),500)
{
sleep 500;
call (function a())-->2nd Instance of interpreter, will start at (*)
}
interpreter <--return //from thread generate !not! execute
interpreter -->return //from callcack
interpreter <--wait for input <---alert("OK");
//sei OK geklickt
interpreter -->return to function
interpreter <--function a() returns <---return
Es folgt also schematisch, mit [x] als Indikator für die jeweilige Thread-/Interpreterebene (exec folgt aus Funktionsaufruf, genThread folgt aus setTimeout):
exec fkt a()[0] -->
genThread t[1]-->
t[1] sleep x ms
exec fkt a()[2] -->
genThread t[2]-->
t[2] sleep x ms
exec fkt a()[n] -->
genThread t[n]-->
t[n] sleep x ms
exec fkt a()[n+1] -->
genThread t[n+1]-->...
mache weiter mit exec a()[n]
mache weiter mit exec a()[2]
mache weiter mit exec a()[1]
mache weiter mit exec a()[0]
Wobei für mich hier ersichtlich ist, wo die Rekursion ist, auch wenn durch die Generierung von threads eine Nebenläufigkeit erzeugt ist, die bewirken kann, dass z.B. a[n] vor a[n+1] beendet wird, was evtl. verwirrt.
Trotzdem steht innerhalb der Funktion a() eine Anweisung, die das erneute Aufrufen der Funktion a() verursacht (indirekter Selbstaufruf ...). Das ist für mich Rekursion, erzeugt wird eine Kette.
Grüsse,
Richard