2012-03-29 4 views
2

Sagen wir, ich bin versucht, eine globale Variable x zu erstellen, wenn es nicht bereits vorhanden ist:Wenn ein globales Objekt in JavaScript zu schaffen, warum muss ich angeben müssen das Schlüsselwort this

x = x || {};   //This fails. x is not defined 
this.x = this.x || {}; //But this works 

Ich bin mit dieser in Firebug und war überrascht, dass die 1. Zeile gescheitert ist. Ich habe erwartet, dass x an das globale Fensterobjekt angehängt wird, aber es hat nicht funktioniert, bis ich die this angegeben habe.

Ich hoffe, mein Verständnis der Sprache zu verbessern. Kann mir jemand erklären, warum das so ist?

Danke für jede Hilfe.

+0

Weil 'x' nicht deklariert ist. Es funktioniert, wenn Sie haben: 'var x;' und dann 'x = x || {} '. Wenn Sie 'this' verwenden, haben Sie dieses Problem nicht, weil Sie auf' x' als * property * (des globalen Objekts) und nicht als * variable * zugreifen. – ZER0

+0

'this.x' funktioniert, weil Sie effektiv einen Verweis auf 'x' in das 'Fenster' einfügen. In einem globalen Bereich bezieht sich "dies" auf "Fenster" – Benno

Antwort

2
  • Wenn Sie eine nicht deklarierte Variable, die einen Teil eines Ausdrucks versuchen und verwenden, werden Sie ein ReferenceError geworfen bekommen.

  • Wenn Sie versuchen, eine nicht deklarierte Variable zuzuweisen, wird die Variable als implizite globale deklariert. Implizite Globals sind schlecht.

x = x || {};   
    ^ its this x that breaks it. 

richtig Um zu überprüfen, ob eine Variable deklariert ist, sollten Sie die typeof variable === "undefined" Prüfung verwenden.

Nicht definierte Attribute jedoch (in Ihrem zweiten Beispiel x ist ein Attribut auf this), halten Sie den Wert standardmäßig.

Verwandte Themen