Javascript: z = z || [] gibt einen Fehler aus, wenn kein VAR verwendet wird - warum?

7
Aus reiner intellektueller Neugierde, warum akzeptiert Javascript

%Vor%

um z zu initialisieren (wie z anfangs definiert werden kann)

aber ohne var, es wirft einen Fehler (im globalen Raum)

%Vor%

(wenn z vorher undefiniert ist)

Im globalen Bereich ist es nicht erforderlich, VAR zu verwenden, obwohl ich es für eine schlechte Übung halte.

Bevor Sie sagen, dass dies ein Duplikat von Fragen wie

ist

Was ist der Zweck des Schlüsselworts var und Wann kann ich es verwenden (oder weglassen)?

Beachten Sie die Deklaration, dass "Wenn Sie im globalen Bereich sind, gibt es keinen Unterschied."

Offensichtlich ist das bei meinem Arbeitsbeispiel nicht 100% richtig.

Ist das eine Eigenart oder gibt es legitime Logik?

eine Zusammenfassung der Antwort hinzufügen, wie ich es gelernt habe:

Dank Tim (siehe unten) war der Schlüssel zu meinem Missverständnis, dies nicht zu realisieren (fundamental von Javascript)

  

var z; tut absolut nichts, wenn z bereits existiert

So scheint dieser Ausdruck es in beide Richtungen zu haben, wenn Sie falsch annehmen, dass "var z" immer initialisiert wird.

Von links beginnend, stellt "var z" einfach sicher, dass z definiert ist, beeinflusst aber keinen vorhandenen Wert, wenn es bereits existiert. Dann rechts, wenn z bereits existiert, wird es verwendet, wenn nicht, wurde die Variable gerade deklariert (aber leer), so dass sie nicht verwendet wird, aber keinen Fehler auslöst.

Dies ist ein ausgezeichneter Artikel zu dieser Art von Scoping und Hebeproblem in Javascript: Ссылка

Vielen Dank an Minitech und alle anderen, die auch dazu beigetragen haben!

    
ck_ 30.01.2012, 16:00
quelle

3 Antworten

6

z = z || [] wird in einen beliebigen Bereich (global oder nicht) geworfen, in dem es keine z in der Scope-Kette gibt. Der Grund dafür ist, dass der Ausdruck zuerst versucht, den Wert einer vorhandenen Variablen namens z auf der rechten Seite abzurufen, was ein Fehler ist, wenn keiner existiert.

Der Grund, warum var z = z || [] keinen Fehler verursacht, ist, dass die Variable z vor der Ausführung des Ausdrucks erstellt wird (falls sie noch nicht existiert), ein Effekt, der allgemein als hosting bekannt ist .

Andererseits wird das Zuweisen eines Werts zu einem nicht aufgelösten Bezeichner (z. B. z = 2 ) in jedem Bereich ohne Fehler funktionieren (außer im strikten ECMAScript 5-Modus, der es verbietet und ausgibt). Wenn der Bezeichner nicht aufgelöst werden kann, wird er als eine Eigenschaft des endgültigen Objekts in der Gültigkeitsbereichskette hinzugefügt, bei der es sich um das globale Objekt handelt, wodurch der Eindruck entsteht, eine globale Variable zu erstellen.

    
Tim Down 30.01.2012, 16:34
quelle
10

Der Effekt ist korrekt. var deklariert immer sofort seine "Operanden", während Ihr Skript, wenn Sie es nicht deklarieren, versucht, eine undefinierte Variable zu verwenden und einen Fehler auszulösen.

Wenn Sie sich in einem globalen Gültigkeitsbereich befinden, können Sie einer nicht vorhandenen Variablen zuweisen, und dies hat den gleichen Effekt wie das Deklarieren, eine schlechte Übung. Natürlich ist es in deinem Fall nicht definiert. Dies gesagt, obwohl es aus intellektueller Neugierde sein könnte, würden Sie nie schreiben

%Vor%

weil es keinen Sinn macht. Eher könnten Sie tun:

%Vor%

. In der Tat, wenn ich Dinge im globalen Bereich deklariere (was nie ;) ist), verwende ich stattdessen window.something , weil es meine Absicht klarer macht.

    
Ry︁ 30.01.2012 16:04
quelle
4

Sie können einer nicht deklarierten Variablen z = 123 ; Sie können jedoch nicht versuchen, einen zu lesen, was z = z || [] tut.

    
Alex K. 30.01.2012 16:08
quelle