2 Stimmen

Zuweisung eines vorhandenen oder leeren Objekts

Dies könnte ein Duplikat sein, aber ich wusste nicht, wie ich danach suchen sollte.

Warum ist

var test = test || {};

arbeiten, aber

var test = testing || {};

einen Fehler auslöst? Zum Zeitpunkt der Definition der beiden test y testing sind undefiniert.

Editar

Die Fehlermeldung lautet "Reference Error: testing is not defined".

3voto

nnnnnn Punkte 142888

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 {} .

1voto

Henrik Andersson Punkte 43664

Das liegt an der var Stichwort. Da die Variable deklariert ist, existiert sie auch, wenn auch mit dem Wert undefiniert. Was die || prüft dann, ob das Objekt wahr ist, und wenn es feststellt, dass es undefiniert ist, gibt es Ihnen ein neues Objekt, mit dem Sie arbeiten können.

Letzteres tut genau das Gleiche, aber da Sie es in "einer Zeile" tun, ist die testing Objekt ist bei der Auswertung nicht definiert und löst daher die Ausnahme aus.

1voto

Jashwant Punkte 27629
var test = test || {};

Hier, test wurde declared aber nicht defined

sondern in,

var test = testing || {};

Es gibt keinen Hinweis auf testing und Sie versuchen immer noch, ihm einen Wert zuzuordnen.

Ein entsprechender Code für den ersten Fall würde lauten,

var testing;  // See testing is still undefined
var test = testing || {};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X