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?
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.
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).
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 delete
true
zurück, wenn die Eigenschaft konfigurierbar ist, und gibt false
zurück, wenn sie nicht konfigurierbar ist.
Deklarierte globale Variable
window
)delete
gelöscht werdenNicht deklarierte globale Variable
window
)delete
gelöscht werdenDer 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).
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.
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.