Beim Deklarieren von Variablen in Javascript läuft es zwar oft ohne Probleme, das Schlüsselwort var zu verwenden oder es nicht zu verwenden, dennoch gibt es Unterschiede zwischen den beiden Vorgehensweisen. Code, der normal läuft, bedeutet nicht, dass er geeigneter Code ist.
var num = 1;
Es deklariert eine Variable im aktuellen Gültigkeitsbereich. Wenn sie in einer Methode deklariert wird, ist sie eine lokale Variable; wenn sie im globalen Gültigkeitsbereich deklariert wird, ist sie eine globale Variable.
und
num = 1;
Tatsächlich ist es eine Zuweisungsoperation an eine Eigenschaft. Zuerst wird versucht, num in der aktuellen Gültigkeitsbereichskette aufzulösen (wenn in einer Methode deklariert, repräsentiert die aktuelle Gültigkeitsbereichskette den globalen Gültigkeitsbereich und den lokalen Gültigkeitsbereich der Methode usw. ...). Wenn num in einer aktuellen Gültigkeitsbereichskette gefunden wird, wird die Zuweisung an die Eigenschaft num ausgeführt. Wenn num nicht gefunden wird, wird im globalen Objekt (d. h. dem Objekt der obersten Ebene der aktuellen Gültigkeitsbereichskette, wie dem window-Objekt) eine Eigenschaft num erstellt und ihr ein Wert zugewiesen.
Hinweis! Es deklariert keine globale Variable, sondern erstellt eine Eigenschaft des globalen Objekts.
Trotzdem kann es Ihnen hier immer noch schwerfallen, den Unterschied zwischen „Variablendeklaration“ und „Erstellen einer Objekteigenschaft“ zu verstehen. Tatsächlich haben Javascript-Variablendeklarationen, die Eigenschaftserstellung und jede Eigenschaft in Javascript bestimmte Flags, die ihre Attribute beschreiben, wie ReadOnly, DontEnum, DontDelete usw.
Da Variablendeklarationen ein nicht löschbares Attribut mit sich bringen, vergleiche var num = 1 und num = 1. Ersteres ist eine Variablendeklaration, die ein nicht löschbares Attribut hat, daher kann sie nicht gelöscht werden; Letzteres ist eine Eigenschaft des globalen Objekts, daher kann sie aus dem globalen Objekt gelöscht werden.
// num1为全局变量,num2为window的一个属性
var num1 = 1;
num2 = 2;
// delete num1; 无法删除
// delete num2; 删除
function model(){
var num1 = 1; // 本地变量
num2 = 2; // window的属性
// 匿名函数
(function(){
var num = 1; // 本地变量
num1 = 2; // 继承作用域(闭包)
num3 = 3; // window的属性
}())
}
PS: Im ECMAScript5-Standard gibt es einen "Strict Mode". Im strikten Modus führt die Zuweisung eines Werts an einen nicht deklarierten Bezeichner zu einem Referenzfehler und verhindert so das versehentliche Erstellen von Eigenschaften des globalen Objekts. Derzeit unterstützen neue Versionen einiger Browser ihn bereits.