Orlok: javascript Object erstellen

Beitrag lesen

Hallo Felix

Du darfst eine Variable nur einmal mit var deklarieren.

Weil sonst was passiert? ;-)

Die mehrfache Deklaration von Variablen mit var innerhalb derselben lexikalischen Umgebung ist laut Spezifikation ausdrücklich erlaubt und führt weder im Sloppy Mode noch im Strict Mode dazu, dass eine Ausnahme geworfen wird. Das ist eine der unwillkommenen Eigenheiten dieses Variablentyps und ein weiterer Grund dafür, besser const und let zu verwenden.

var x = 1;

var x = 2;

console.log(x); // 2

Wenn derselbe Bezeichner bei mehr als einer Deklaration im selben Gültigkeitsbereich auftaucht, dann wird bei der Initialisierung des Ausführungskontextes schlicht und ergreifend nur eine Variable definiert und die anderen Deklarationen werden als normale Zuweisungsausdrücke behandelt.

var x = 1;

x = 2;

console.log(x); // 2

Bei einer Variablendeklaration mit let sieht das allerdings anders aus. Unabhängig davon, in welchem Modus das Programm ausgeführt wird, führt eine Mehrfachdeklaration hier immer dazu, dass ein Fehler produziert wird.

let x = 1;

let x = 2; // syntax error

Ich denke, Emanuel war sich hier nicht bewusst, dass Variablen die mit var deklariert werden keinen Block Scope haben, sie also prinzipiell überall innerhalb des Codes sichtbar sind, der mit einem Ausführungskontext assoziiert ist. Also für den Fall, dass er hier noch mitliest:

if (true) {
  var x = 1;
}

console.log(x); // 1

Der Anweisungsblock eines Conditional Statements wie in dem Beispiel oben stellt für Variablen die mit var deklariert werden keinen eigenen Gültigkeitsbereich dar. Das heißt, eine Variable die innerhalb eines solchen Blocks deklariert wird, ist grundsätzlich auch außerhalb sichtbar und kann entsprechend referenziert werden. Darum handelte es sich bei der Variable Namens element im geposteten Code um eine Redeklaration, die wie gesehen zwar erlaubt, aber sehr schlechter Stil ist.

function fn ( ) {
  var x = 1;
  console.log(x);
}

var x = 2;
console.log(x); // 2

fn( ); // 1

Ein Gültigkeitsbereich für Variablen die mit var deklariert werden wird also immer nur über einen Ausführungskontext definiert, was entweder ein globaler Kontext sein kann, oder eben der Kontext von Funktionen. Man kann sich also merken, dass solche Variablen immer funktionsweit sichtbar sind und alle Blöcke, die nicht den Körper einer Funktion umschließen entsprechend keinen Gültigkeitsbereich für Variablen definieren, die mit var deklariert werden.

Viele Grüße,

Orlok