web-dev-qa-db-de.com

Auswirkung deklarierter und nicht deklarierter Variablen

Was ist der Hauptunterschied zwischen deklarierten und nicht deklarierten JavaScript-Variablen, da der Löschoperator Für deklarierte Variablen nicht funktioniert?

 var y = 43;     // declares a new variable
 x = 42;

 delete x;       // returns true  (x is a property of the global object and can be deleted)
 delete y;       // returns false (delete doesn't affect variable names) 

Warum passiert das? Global deklarierte Variablen sind auch die Eigenschaften des Fensterobjekts. Warum kann es nicht gelöscht werden?

26

Deklarierte und nicht deklarierte globale Variablen

Der Mechanismus zum Speichern und Zugreifen auf sie ist derselbe, aber JavaScript behandelt sie in einigen Fällen unterschiedlich, je nach dem Wert des Attributs configurable (unten beschrieben). Bei normalem Gebrauch sollten sie sich genauso verhalten.

Beide existieren im globalen Objekt

Nachfolgend einige Vergleiche der globalen Variablen deklariert und undeclared.

var declared = 1;  // Explicit global variable (new variable)
undeclared   = 1;  // Implicit global variable (property of default global object)

window.hasOwnProperty('declared')    // true
window.hasOwnProperty('undeclared')  // true

window.propertyIsEnumerable('declared')    // true
window.propertyIsEnumerable('undeclared')  // true

window.declared     // 1
window.undeclared   // 1

window.declared   = 2;
window.undeclared = 2;

declared     // 2
undeclared   // 2

delete declared     // false
delete undeclared   // true
delete undeclared   // true (same result if delete it again)

delete window.declared     // false
delete window.undeclared   // true (same result if delete it yet again)
delete window.undeclared   // true (still true)

Die globalen Variablen deklariert und undeclared sind Eigenschaften des window-Objekts (das globale Standardobjekt). Keiner von ihnen wird durch die Prototypkette von einem anderen Objekt geerbt. Beide sind direkt im Objekt window vorhanden (da window.hasOwnProperty für beide true zurückgibt).

Das konfigurierbare Attribut

Für deklarierte globale Variablen ist das configurable-Attribut false. Für globale Variablen {undeclared ist es true. Der Wert des configurable-Attributs kann mit der getOwnPropertyDescriptor -Methode abgerufen werden (siehe unten).

var declared = 1;
undeclared = 1;

(Object.getOwnPropertyDescriptor(window, 'declared')).configurable     // false
(Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable   // true

Wenn das configurable-Attribut einer Eigenschaft true ist, können die Attribute der Eigenschaft mit der Methode defineProperty geändert werden, und die Eigenschaft kann mit dem Operator delete gelöscht werden. Andernfalls können die Attribute nicht geändert werden und die Eigenschaft kann auf diese Weise nicht gelöscht werden.

Im nicht strengen Modus gibt der Operator deletetrue zurück, wenn die Eigenschaft konfigurierbar ist, und gibt false zurück, wenn sie nicht konfigurierbar ist.

Zusammenfassung

Deklarierte globale Variable

  • Ist eine Eigenschaft des globalen Standardobjekts (window)
  • Die Eigenschaftsattribute nicht können geändert werden.
  • Kann nicht mit dem Operator delete gelöscht werden

Nicht deklarierte globale Variable

  • Ist eine Eigenschaft des globalen Standardobjekts (window)
  • Die Eigenschaftsattribute can können geändert werden.
  • Kann kann mit dem Operator delete gelöscht werden

Siehe auch

24
Matt Coughlin

Der Hauptunterschied besteht darin, dass Sie Variablen innerhalb einer Funktion deklarieren. Wenn Sie var verwenden, wenn Sie eine Variable innerhalb einer Funktion deklarieren, wird diese Variable zu einer lokalen Variablen. Wenn Sie jedoch nicht var verwenden, wird die Variable zu einer globalen Variablen, unabhängig davon, wo Sie sie deklarieren (innerhalb oder außerhalb einer Funktion).

1
Pat

Wenn eine Variable über die Variablendeklaration in JavaScript erstellt wird, werden diese Eigenschaften mit dem Attribut " DontDelete " erstellt. Dies bedeutet, dass von Ihnen erstellte Variablen nicht mit dem Ausdruck "delete" gelöscht werden können. Alle Funktionen, Argumente und Funktionsparameter werden standardmäßig mit diesem DontDelete-Attribut erstellt. Sie können sich DontDelete als Flagge vorstellen. 

var y = 43;
delete y;         //returns false because it is has a DontDelete attribute

Während nicht deklarierte Zuweisung keine Attribute wie DontDelete setzt. Wenn wir also den Operator delete auf diese nicht deklarierte Variable anwenden, wird true zurückgegeben.

x = 42;
delete x;        //returns true because it doesn't have a DontDelete attribute

Der Unterschied zwischen Eigenschaftszuweisung und Variablendeklaration - Letzterer setzt DontDelete, während der vorherige nicht verwendet wird. Aus diesem Grund wird bei einer nicht deklarierten Zuweisung eine löschbare Eigenschaft erstellt.

Link, wie genau der Operator funktioniert

1

löschen wirkt sich nur auf die Eigenschaften eines Objekts aus. Es hat keine Auswirkung auf Variablen- oder Funktionsnamen.

In Ihrem Fall x = 42; deklariert die Variable X und macht sie zur Eigenschaft des Global-Objekts. So kehrt es wahr zurück. 

Und var y = 43; deklariert eine globale Variable, die nicht Teil eines Objekts ist, und gibt daher false zurück. 

0
Jay Bhatt