var

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die var Anweisung deklariert funktions- oder global-gescope Variablen und initialisiert optional jede mit einem Wert.

Probieren Sie es aus

var x = 1;

if (x === 1) {
  var x = 2;

  console.log(x);
  // Expected output: 2
}

console.log(x);
// Expected output: 2

Syntax

js
var name1;
var name1 = value1;
var name1 = value1, name2 = value2;
var name1, name2 = value2;
var name1 = value1, name2, /* …, */ nameN = valueN;
nameN

Der Name der zu deklarierenden Variablen. Jede muss ein legaler JavaScript-Bezeichner oder ein Destructuring-Bindungsmuster sein.

valueN Optional

Anfangswert der Variablen. Es kann jeder legale Ausdruck sein. Standardwert ist undefined.

Beschreibung

Der Gültigkeitsbereich einer mit var deklarierten Variablen ist eine der folgenden in geschweifte Klammern eingeschlossenen Syntaxen, die die var Anweisung am engsten umschließt:

Oder wenn keine der oben genannten zutrifft:

  • Das aktuelle Modul, für Code, der im Modulmodus ausgeführt wird
  • Der globale Gültigkeitsbereich, für Code, der im Skriptmodus ausgeführt wird.
js
function foo() {
  var x = 1;
  function bar() {
    var y = 2;
    console.log(x); // 1 (function `bar` closes over `x`)
    console.log(y); // 2 (`y` is in scope)
  }
  bar();
  console.log(x); // 1 (`x` is in scope)
  console.log(y); // ReferenceError, `y` is scoped to `bar`
}

foo();

Wichtig ist, dass andere Blockkonstrukte, einschließlich Blockanweisungen, try...catch, switch, Kopfzeilen von einer der for-Anweisungen, keine Gültigkeitsbereiche für var erzeugen, und Variablen, die mit var innerhalb eines solchen Blocks deklariert wurden, weiterhin außerhalb des Blocks referenziert werden können.

js
for (var a of [1, 2, 3]);
console.log(a); // 3

In einem Skript wird eine mit var deklarierte Variable als nicht konfigurierbare Eigenschaft des globalen Objekts hinzugefügt. Das bedeutet, dass ihr Eigenschaftsdeskriptor nicht geändert werden kann und sie nicht mit delete gelöscht werden kann. JavaScript hat eine automatische Speicherverwaltung, und es wäre sinnlos, den delete-Operator auf eine globale Variable anwenden zu können.

js
"use strict";
var x = 1;
Object.hasOwn(globalThis, "x"); // true
delete globalThis.x; // TypeError in strict mode. Fails silently otherwise.
delete x; // SyntaxError in strict mode. Fails silently otherwise.

In sowohl NodeJS CommonJS Modulen als auch nativen ECMAScript-Modulen sind Variablendeklarationen auf Module beschränkt und werden nicht als Eigenschaften zum globalen Objekt hinzugefügt.

Die Liste, die dem var Schlüsselwort folgt, wird Bindungsliste genannt und ist durch Kommas getrennt, wobei die Kommas keine Kommaoperatoren und die = Zeichen keine Zuweisungsoperatoren sind. Initialisierer späterer Variablen können sich auf frühere Variablen in der Liste beziehen und den initialisierten Wert erhalten.

Hoisting

var-Deklarationen, egal wo sie in einem Skript auftreten, werden verarbeitet, bevor irgendein Code innerhalb des Skripts ausgeführt wird. Das Deklarieren einer Variablen irgendwo im Code ist gleichbedeutend mit ihrem Deklarieren am Anfang. Das bedeutet auch, dass eine Variable scheinbar verwendet werden kann, bevor sie deklariert wird. Dieses Verhalten wird _hoisting_ genannt, da es so erscheint, als ob die Variablendeklaration an den Anfang der Funktion, des statischen Initialisierungsblocks oder der Skriptquelle, in der sie vorkommt, verschoben wird.

Note: var-Deklarationen werden nur an den Anfang des aktuellen Skripts verschoben. Wenn Sie zwei <script>-Elemente innerhalb eines HTML haben, kann das erste Skript nicht auf Variablen zugreifen, die vom zweiten deklariert wurden, bevor das zweite Skript verarbeitet und ausgeführt wurde.

js
bla = 2;
var bla;

Dies wird implizit verstanden als:

js
var bla;
bla = 2;

Aus diesem Grund wird empfohlen, Variablen immer am Anfang ihres Gültigkeitsbereichs zu deklarieren (oben im globalen Code und oben im Funktionscode), damit klar ist, welche Variablen dem aktuellen Funktionsbereich gehören.

Nur die Deklaration einer Variablen wird verschoben, nicht ihre Initialisierung. Die Initialisierung erfolgt erst, wenn die Zuweisungsanweisung erreicht wird. Bis dahin bleibt die Variable undefined (aber deklariert):

js
function doSomething() {
  console.log(bar); // undefined
  var bar = 111;
  console.log(bar); // 111
}

Dies wird implizit verstanden als:

js
function doSomething() {
  var bar;
  console.log(bar); // undefined
  bar = 111;
  console.log(bar); // 111
}

Redeclarations

Doppelte Variablendeklarationen mit var führen nicht zu einem Fehler, selbst im strikten Modus, und die Variable verliert ihren Wert nicht, es sei denn, die Deklaration hat einen Initialisierer.

js
var a = 1;
var a = 2;
console.log(a); // 2
var a;
console.log(a); // 2; not undefined

var-Deklarationen können auch im gleichen Gültigkeitsbereich wie eine function-Deklaration stehen. In diesem Fall überschreibt der Initialisierer der var-Deklaration immer den Wert der Funktion, unabhängig von ihrer relativen Position. Dies ist der Fall, weil Funktionsdeklarationen vor jedem Initialisierer ausgewertet werden, sodass der Initialisierer später kommt und den Wert überschreibt.

js
var a = 1;
function a() {}
console.log(a); // 1

var-Deklarationen können nicht im gleichen Gültigkeitsbereich wie eine let, const, class, oder import-Deklaration sein.

js
var a = 1;
let a = 2; // SyntaxError: Identifier 'a' has already been declared

Da var-Deklarationen nicht auf Blöcke beschränkt sind, gilt dies auch für den folgenden Fall:

js
let a = 1;
{
  var a = 1; // SyntaxError: Identifier 'a' has already been declared
}

Es gilt nicht für den folgenden Fall, bei dem let sich in einem untergeordneten Bereich von var befindet, nicht im gleichen Bereich:

js
var a = 1;
{
  let a = 2;
}

Eine var-Deklaration innerhalb des Funktionskörpers kann denselben Namen wie ein Parameter haben.

js
function foo(a) {
  var a = 1;
  console.log(a);
}

foo(2); // Logs 1

Eine var-Deklaration innerhalb eines catch-Blocks kann denselben Namen wie der catch-gebundene Bezeichner haben, jedoch nur, wenn die catch-Bindung ein einfacher Bezeichner ist, nicht ein Destrukturierungsmuster. Dies ist eine veraltete Syntax und Sie sollten sich nicht darauf verlassen. In diesem Fall wird die Deklaration aus dem catch-Block heraus verschoben, aber jeder innerhalb des catch-Blocks zugewiesene Wert ist außerhalb nicht sichtbar.

js
try {
  throw new Error();
} catch (e) {
  var e = 2; // Works
}
console.log(e); // undefined

Beispiele

Deklarieren und Initialisieren von zwei Variablen

js
var a = 0,
  b = 0;

Zuweisen von zwei Variablen mit einem einzelnen Stringwert

js
var a = "A";
var b = a;

Dies entspricht:

js
var a, b = a = "A";

Beachten Sie die Reihenfolge:

js
var x = y,
  y = "A";
console.log(x, y); // undefined A

Hier werden x und y deklariert, bevor irgendein Code ausgeführt wird, aber die Zuweisungen erfolgen später. Zu dem Zeitpunkt, an dem x = y ausgewertet wird, existiert y, sodass kein ReferenceError ausgelöst wird und sein Wert ist undefined. Daher wird x der Wert undefined zugewiesen. Dann wird y der Wert "A" zugewiesen.

Initialisierung mehrerer Variablen

Seien Sie vorsichtig mit der Syntax var x = y = 1y wird eigentlich nicht als Variable deklariert, sodass y = 1 eine nicht qualifizierte Bezeichnerzuweisung ist, die eine globale Variable im Nicht-Striktmodus erstellt.

js
var x = 0;
function f() {
  var x = y = 1; // Declares x locally; declares y globally.
}
f();

console.log(x, y); // 0 1

// In non-strict mode:
// x is the global one as expected;
// y is leaked outside of the function, though!

Dasselbe Beispiel wie oben, aber im Strikten Modus:

js
"use strict";

var x = 0;
function f() {
  var x = y = 1; // ReferenceError: y is not defined
}
f();

console.log(x, y);

Implizite Globals und äußerer Funktionsbereich

Variablen, die scheinbar implizite Globals sind, können Verweise auf Variablen in einem äußeren Funktionsbereich sein:

js
var x = 0; // Declares x within file scope, then assigns it a value of 0.

console.log(typeof z); // "undefined", since z doesn't exist yet

function a() {
  var y = 2; // Declares y within scope of function a, then assigns it a value of 2.

  console.log(x, y); // 0 2

  function b() {
    x = 3; // Assigns 3 to existing file scoped x.
    y = 4; // Assigns 4 to existing outer y.
    z = 5; // Creates a new global variable z, and assigns it a value of 5.
    // (Throws a ReferenceError in strict mode.)
  }

  b(); // Creates z as a global variable.
  console.log(x, y, z); // 3 4 5
}

a(); // Also calls b.
console.log(x, z); // 3 5
console.log(typeof y); // "undefined", as y is local to function a

Deklaration mit Destrukturierung

Die linke Seite jedes = kann auch ein Bindungsmuster sein. Dies ermöglicht das Erstellen mehrerer Variablen auf einmal.

js
const result = /(a+)(b+)(c+)/.exec("aaabcc");
var [, a, b, c] = result;
console.log(a, b, c); // "aaa" "b" "cc"

Für mehr Informationen siehe Destrukturierung.

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-variable-statement

Browser-Kompatibilität

Siehe auch