Es gibt einen Unterschied zwischen einer nicht definierten Variablen im Sinne von nicht vorhanden und einer Variablen, die den Wert undefined
.
In Ihrem ersten Beispiel deklarieren Sie test
con var
so dass, wenn der Ausdruck auf der rechten Seite der =
ausgewertet wird, ist die Variable test
existiert, hat aber den Wert undefined
.
In Ihrem zweiten Beispiel haben Sie nicht definiert testing
überhaupt nicht, daher der Fehler.
EDIT: Mir fällt ein, dass eine weitere Erklärung vielleicht nicht schaden würde.
Zur Vereinfachung führt die JavaScript-Engine zwei Durchläufe durch den Code durch. Der erste Durchlauf ist die Parse-/Kompilierphase, und dann werden die Variablendeklarationen aber keine Zuweisungen passieren. Der zweite Durchlauf ist die eigentliche Ausführung, bei der die Zuweisungen erfolgen. Dies führt zu einem Effekt, der oft als "Variablen-Hoisting" bezeichnet wird - es ist so, als ob die JS-Engine die Deklarationen an den oberen Rand ihres Bereichs "hievt", die Zuweisungen aber dennoch an Ort und Stelle vornimmt.
Was also den Sinn eines solchen Codes betrifft:
var test = test || {};
...heißt es im Grunde: "Hat test
bereits mit einem Wahrheitswert vorhanden? Wenn ja, verwenden Sie ihn, andernfalls setzen Sie ihn auf ein neues leeres Objekt."
Der JS-Engine macht es nichts aus, wenn dieselbe Variable mehr als einmal im selben Bereich deklariert wird - sie ignoriert grundsätzlich die zweite Erklärung, ignoriert aber nicht jede Auftrag in der zweiten Erklärung enthalten. Wenn also test
in einem anderen Skriptblock deklariert ist, vielleicht in einer separaten JS-Include-Datei, dann weist die betreffende Zeile einfach test
zu sich selbst (unter der Annahme, dass es einen Wahrheitswert hat, wobei alle Objekte wahrheitsgemäß sind). Wenn es aber nicht an anderer Stelle deklariert wurde, existiert es trotzdem als Ergebnis der aktuellen var
Anweisung, aber es wird undefined
vor der aktuellen Zuweisung, so dass dann die ||
Operator gibt den rechten Operanden zurück, der {}
.