Die Schleife dauert garantiert immer länger als 1 Millisekunde, trotzdem werden die Timeouts schön nacheinander abgearbeitet. Keine Spur von Parallele Tätigkeiten.
Meiner Meinung nach verwechselst du einige Dinge; Dein Beispiel wird nur deshalb "Quasisequenziell" abgearbeitet, da (sei D eine Ausgabefunktion innerhalb des Fensters) die komplette dynamische Aktualisierung (redraw) eines Fensters immer erst nach dem Beenden einer Javascriptfunktion vorgenommen wird.
Aha, auch die Zuweisung einer Eigenschaft? Das ist Unsinn.
Probier doch einfach mal was aus, bevor du etwas behauptest, also hier ein Besispiel, wo nicht direkt in ein Feld geschrieben wird, sondern erst am Schluss:
<textarea rows=10 cols=50 name="out"></textarea>
</form>
<script type="text/javascript" >
var o = document.forms[0].out;
o.value = '';
var debug_txt = '';
function D(txt){
if(!o) return;
debug_txt += txt + '\n';
}
function a()
{
D('start a( '+ ++count +')');
if (count<5) window.setTimeout("a()",1);
else {
// hier sind alle 5 Timeouts fertig.
o.value = debug_txt;
}
for(var i = 0; i < 10000; i++) {var x = Math.sin(1);}
D('ende a( '+ count +')');
}
a();
</script>
Wie du siehst ändert sich gar nichts.
Deshalb werden nach aufruf a()[x] auch immer start[x]/ende[x] quasi zeitgleich ausgegeben (kannst du ja mal prüfen) und dann erst start[x+1]/ende[x+1], auch hier der redraw nach Funktionsende; die Ausgabe erfolgt nach a()[x], weil a()[x+1] später gestartet wurde und die Laufzeit gleich ist.
Dann versuch diese These mal zu beweisen, z.b. in dem du die Laufzeit der Funktionen unterschiedlich lang machst. Übrigens ändert sich nichts am Abluaf, wenn du gar ncihts in der Funktion machst, sie werden sequentiell ausgeführt, immer!
Mein Beispiel war schon korrekt, denn alert() ist normalerweise blockierend,
genau, normalerweise, aber nicht wenn du dieses in einem Timout aufrufst. Dann kannst du, wie schon gesagt, soviel alert() Fenster öffnen wier du willst
d.h. die Javascriptfunktion hält an der Stelle, an der ein Alert ausgegeben wird, an.
Tut es ja, aber die Timeouts werden trotzdem ausgeführt.
Somit müsste (nach deiner Aussage) auch der timeout auf das Bestätigen des Alerts warten, da ja die aufrufende a()[x] Funktion offensichtlich noch nicht beendet ist.
Das habe ich nicht gesagt, der timeout wird immer ausgeführt, aber die Ausführung des weiteren Codes, nach alert(), wird erst nach bestätigen des OK Button ausgeführt. Das kannst du auch leicht nachprüfen, in dem du wahllos in die alert() Fenster wegklickst und dir ausgeben läßt, welche wo das Programm dann weiterläuft.
Ich denke von meiner Seite ist alles dazu gesagt - und ich glaube nicht, dass ich noch weiter was dazu erklären kann.
Du liegst auch falsch.
Deshalb nicht böse sein, aber ich zieh mich hiermit aus der Diskussion zurück.
Ich bin nicht böse, ich konnte hier schön Rekursion erklären und vielleicht hat es der eine oder andere auch verstanden.
Struppi.