Rolf b: return Wert über JavaScript strukrur

Beitrag lesen

Hallo,

das Henne-Ei Problem ist eins, aber anders als formuliert (ich reite hier lediglich etwas auf Begrifflichkeiten rum). Javascript betreibt etwas, das Hoisting genannt wird. Das bedeutet, dass alle Deklarationen von Variablen automagisch an den Anfang der Funktion gezogen werden, in der sie vorkommen. Ein REFERENZIEREN von foo und bar ist also durchaus möglich. Die beiden folgenden Funktionen sind semantisch identisch:

function f1() 
{
   var foo = { b : bar },
       bar = { f : foo };
}
function f2() 
{
   var foo, bar;
   foo = { b : bar },
   bar = { f : foo };
}

Trotzdem funktioniert der Code nicht wie beabsichtigt, weil zwar die Deklaration gehoistet wird, aber an bar noch kein Wert zugewiesen ist, wenn foo.b erzeugt wird. Darum die Lösung Des Martin, weil sie erstmal leere Objekte anlegt, die dann bei der Erzeugung der Properties korrekt erreichbar sind.

Zur Sequentialität: Wenn ich eine Funktion dieser Art habe

var abc = function() {
   a();
   b();
   c();
}

dann wird während der Verarbeitung von abc() definitiv die Aufruffolge a, b, c eingehalten. Davon beißt die Maus keinen Faden ab (und bei Gunnar auch nicht die Tastatur). Sofern innerhalb von b per setTimeout oder setInterval ein zeitgesteuerter Aufruf von a, c oder auch b beauftragt wird, dann endet trotzdem ERST der Aufruf von abc(), und auch alle Aufrufe im Callstack, die dorthin geführt haben, bevor setTimeout oder setInterval zum Zug kommen.

Wenn Firebug diese Abfolge durcheinander bringt, dann ist der Firebug ein Stück Käse, an dem die Maus gern knabbern darf. Es ist zugegebenermaßen schwer für einen Debugger, solche Timingthemen exakt zu bewahren, aber im Fall von Javascript mit seiner strikt sequentiellen Verarbeitung (außer Webworker) ist das nicht soo schwer.

Jürgen, nur der Neugier halber - du schreibst dass die Browser Javascript strikt sequentiell abarbeiten. Hat bspw. Node oder eine andere Ausführungsumgebung andere Eigenschaften?

Gruß Rolf