JavaScript Variables
In JavaScript gibt es drei Wege, Variablen zu deklarieren:
var,
let und const. Jede hat ihre eigenen Regeln für Scope, Hoisting und
Reassignment.
Grundlagen
Was sind Variablen?
Variablen sind wie beschriftete Container, in denen du Werte speichern kannst. Du kannst dir das wie Schubladen vorstellen, auf die du einen Namen schreibst und in die du dann etwas hineinlegst.
- Die Schublade ist die Variable
- Der Name auf der Schublade ist der Variablenname
- Das Ding, das du hineinlegst, ist der Wert
Du sagst also: Ich lege etwas in diese Schublade und gebe der Schublade einen Namen.
Die grundlegende Syntax
Damit JavaScript weiß, dass du eine neue Schublade (= Variable) anlegst, musst du ein Keyword schreiben.
let→ flexible Variableconst→ fester Wert, der nicht neu zugewiesen werden darf
let name = "Anna-Maria"; // Schublade 'name' anlegen → darin steckt "Anna"
const age = 25; // Schublade 'age' anlegen → darin steckt 25
Zerlegen wir das:
let userName = "Anna-Maria";let→ Ich möchte eine neue Variable anlegenuserName→ So heißt die Schublade (sprechend)=→ Der Wertzuweisungs-Operator („Lege diesen Wert hinein“)"Anna-Maria"Der Wert;→ Satzende
// Eine Variable deklarieren und einen Wert zuweisen
let userName = "Anna-Maria";
let userAge = 25;
let isLoggedIn = true;
// Den Wert der Variable verwenden
console.log(userName); // Gibt "Anna-Maria" aus
Wofür brauche ich Variablen?
- Informationen speichern
- Dinge berechnen
- später wieder abrufen
- Werte ändern
let - Zwischenstände in Programmen halten
let score = 0;
score = score + 1; // Spieler hat einen Punkt bekommen
console.log(score); // Ausgabe: 1
Die wichtigsten Datentypen
Variablen können verschiedene Arten von Werten enthalten
let text = "Hallo"; // String
let zahl = 42; // Number
let wahr = true; // Boolean
let liste = [1, 2]; // Array
let person = { name: "Anna-Maria" }; // Objekt
Du musst sie NICHT vorher als „Typ“ markieren — JavaScript erkennt es selbst.
Datentyp prüfen mit typeof
console.log(typeof "Hallo"); // "string"
console.log(typeof 42); // "number"
console.log(typeof true); // "boolean"
console.log(typeof [1, 2]); // "object" (Arrays sind auch Objekte!)
console.log(typeof { a: 1 }); // "object"
Primitive vs. Referenz-Typen
Um zu verstehen, warum const bei Objekten "anders"
funktioniert,
hilft es, den Unterschied zwischen primitiven und Referenz-Typen zu kennen:
Primitive Typen
Der Wert wird direkt gespeichert:
- String
- Number
- Boolean
- undefined
- null
Referenz-Typen
Eine Referenz (Adresse) wird gespeichert:
- Object
- Array
- Function
// Primitiv: Wert wird kopiert
let a = 5;
let b = a;
b = 10;
console.log(a); // 5 (unverändert!)
// Referenz: Adresse wird kopiert
const arr1 = [1, 2, 3];
const arr2 = arr1;
arr2.push(4);
console.log(arr1); // [1, 2, 3, 4] (beide zeigen auf dasselbe Array!)
const user = { name: "Anna" } speichert nicht das
Objekt
selbst, sondern die Adresse zum Objekt. Die Adresse bleibt konstant,
aber der
Inhalt an dieser Adresse kann sich ändern.
Die drei Arten der Variablen-Deklaration
JavaScript bietet dir drei Keywords zur Variablen-Deklaration:
- var - Die alte Methode (ES5), die heute nicht mehr empfohlen wird
- let - Moderne Variablen-Deklaration für Werte, die sich ändern können (ES6)
- const - Für konstante Werte, die nach der Zuweisung nicht mehr geändert werden sollen (ES6)
Seit ES6 (2015) solltest du var vermeiden und
stattdessen let und const verwenden. Diese bieten besseren
ScopeGültigkeitsbereich
und verhindern viele häufige Fehler.
var, let und const im Detail
const - Konstante Werte
const verwendest du für Werte, die sich nicht ändern sollen. Einmal
zugewiesen,
kannst du den Wert nicht mehr neu zuweisen.
// Konstante deklarieren
const PI = 3.14159;
const siteName = "DevPanicZone";
// Das funktioniert NICHT:
PI = 3.14; // TypeError: Assignment to constant variable
Bei Objekten und Arrays kannst du mit const zwar keine
neue Referenz zuweisen, aber die Inhalte ändern:
const user = { name: "Anna-Maria" };
user.name = "Anna"; // Inhalt verändert
user = { name: "Anna"}; // geht nicht
const
- Du darfst nicht die Schublade austauschen
- aber
- Du darfst den Inhalt verändern
Das liegt daran, dass user eine „Referenz“ speichert — das ist aber
Anfänger-Advanced.
Fürs erste reicht:
const= Schublade bleibt dieselbe- Inhalt darf verändert werden, wenn es ein Objekt ist.
let - Variable Werte
let verwendest du für Werte, die sich im Laufe des Programms ändern können.
// Variable deklarieren
let counter = 0;
// Wert ändern - das funktioniert!
counter = 1;
counter = counter + 1;
counter++;
console.log(counter); // 3
var - Die alte Methode (nicht empfohlen)
var war die ursprüngliche Art, Variablen zu deklarieren. Es hat aber einige
Probleme, die zu unerwartetem Verhalten führen können.
// Funktioniert, aber nicht empfohlen
var oldStyle = "nicht mehr nutzen";
// Probleme mit var:
var x = 1;
var x = 2; // Erlaubt! Kann zu Bugs führen
// Mit let wäre das ein Fehler:
let y = 1;
let y = 2; // SyntaxError: Identifier 'y' has already been declared
Verwende immer const als Standard. Nur wenn du
weißt, dass sich der Wert ändern muss, verwende let. Vermeide
var
komplett.
Scope (Gültigkeitsbereich)
Der Scope bestimmt, wo eine Variable zugänglich ist. JavaScript kennt verschiedene Arten von Scope:
Global Scope
Variablen, die außerhalb aller Funktionen und Blöcke deklariert werden, sind global zugänglich.
// Global Scope
const globalVar = "Überall verfügbar";
function showGlobal() {
console.log(globalVar); // Funktioniert!
}
showGlobal();
Function Scope
Alle drei Keywords var, let & const haben
Function
Scope
- sie sind nur innerhalb der Funktion zugänglich, in der sie deklariert wurden.
function testFunctionScope() {
const functionVar = "Nur in der Funktion";
console.log(functionVar); // Funktioniert!
}
console.log(functionVar); // ReferenceError: functionVar is not defined
Block Scope
let und const haben Block Scope - sie sind nur innerhalb des
Blocks
{...} zugänglich. var hat KEINEN Block Scope!
// let und const mit Block Scope
if (true) {
let blockLet = "Nur im Block";
const blockConst = "Auch nur im Block";
var blockVar = "Außerhalb auch verfügbar!";
console.log(blockLet); // Funktioniert
}
console.log(blockLet); // ReferenceError
console.log(blockConst); // ReferenceError
console.log(blockVar); // "Außerhalb auch verfügbar!" - Achtung!
Es verhindert, dass Variablen ungewollt
überschrieben werden und macht deinen Code vorhersehbarer. Das ist einer der
Hauptgründe,
warum let und const besser sind als var.
Hoisting
Hoisting ist ein JavaScript-Mechanismus, bei dem Variablen-Deklarationen an den Anfang ihres
Scopes "gehoben" werden. Das Verhalten unterscheidet sich zwischen var,
let und const.
Hoisting mit var
Bei var wird die Deklaration nach oben gehoben und mit
undefined
initialisiert.
// Was du schreibst:
console.log(myVar); // undefined (kein Fehler!)
var myVar = "Hallo";
// Was JavaScript daraus macht:
var myVar; // Deklaration wird nach oben gehoben
console.log(myVar); // undefined
myVar = "Hallo"; // Zuweisung bleibt hier
Hoisting mit let und const
Bei let und const werden die Variablen auch gehoben, aber sie
befinden
sich in der "Temporal Dead Zone" und können nicht verwendet werden, bevor sie deklariert
wurden.
// Das verursacht einen Fehler:
console.log(myLet); // ReferenceError: Cannot access 'myLet' before initialization
let myLet = "Hallo";
console.log(myConst); // ReferenceError: Cannot access 'myConst' before initialization
const myConst = "Hallo";
Deklariere deine Variablen immer am Anfang ihres Scopes. So vermeidest du Verwirrung durch Hoisting und machst deinen Code lesbarer.
Naming Conventions
Gute Variablennamen machen deinen Code lesbarer und wartbarer. Hier sind die wichtigsten Regeln:
- Verwende camelCase für Variablennamen:
userName,userAge,isLoggedIn - Beginne mit einem Buchstaben,
$oder_- nicht mit einer Zahl - Verwende nur Buchstaben, Zahlen,
$und_ - Vermeide reservierte Keywords wie
class,function,return - JavaScript ist case-sensitive:
userNameundusernamesind verschiedene Variablen
let userName = "Anna-Maria";
let userAge = 25;
let isLoggedIn = true;
let _privateVar = "internal";
let $element = document.querySelector(".test");
// Nicht aussagekräftig
let x = "Anna-Maria";
// Syntaxfehler: beginnt mit Zahl
let 1user = "Anna-Maria";
// Syntaxfehler: enthält Bindestrich
let user-name = "Anna-Maria";
Konstanten in UPPER_CASE
Konstanten, die sich wirklich nie ändern (z.B. Konfigurationswerte), schreibst du oft in UPPER_CASE mit Unterstrichen:
const MAX_USERS = 100;
const API_KEY = "abc123xyz";
const DEFAULT_COLOR = "#333333";
// Aber normale const-Variablen bleiben in camelCase:
const userName = "Anna-Maria";
const currentDate = new Date();
Beschreibende Namen
Wähle Namen, die beschreiben, was die Variable enthält. Andere Entwickler (und dein zukünftiges Ich) werden es dir danken!
let d = new Date();
let temp = users.filter(u => u.age > 18);
let currentDate = new Date();
let adultUsers = users.filter(user => user.age > 18);
Best Practices
1. const als Standard, let wenn nötig
Verwende standardmäßig const. Nur wenn du weißt, dass sich der Wert ändern
muss,
verwende let. Das verhindert versehentliche Neuzuweisungen.
// Gut: const für Werte, die sich nicht ändern
const siteName = "DevPanicZone";
const MAX_ATTEMPTS = 3;
// Gut: let für Werte, die sich ändern
let currentAttempt = 0;
currentAttempt++;
// Nicht optimal: let obwohl const reichen würde
let userName = "Anna-Maria";
// Wenn sich das nie ändert, nutze const
2. Deklariere Variablen am Anfang
Deklariere alle Variablen am Anfang ihres Scopes. Das macht den Code übersichtlicher und vermeidet Hoisting-Probleme.
function processUser() {
// Alle Variablen am Anfang
const userName = "Anna-Maria";
let userAge = 25;
let isValid = false;
// Dann die Logik
if (userAge >= 18) {
isValid = true;
}
return isValid;
}
3. Vermeide var komplett
Es gibt keinen Grund mehr, var zu verwenden. let und
const
sind in jeder Hinsicht besser.
var count = 0;
let count = 0;
4. Ein Konzept, eine Variable
Verwende nicht dieselbe Variable für verschiedene Zwecke. Erstelle lieber neue Variablen mit aussagekräftigen Namen.
// Verwirrend: Variable wird für verschiedene Dinge benutzt
let data = fetchUsers();
data = data.filter(u => u.active);
data = data.map(u => u.name);
// Klar: Jede Variable hat einen eigenen Zweck
const allUsers = fetchUsers();
const activeUsers = allUsers.filter(user => user.active);
const userNames = activeUsers.map(user => user.name);
5. Vermeide globale Variablen
Globale Variablen können von überall im Code geändert werden, was zu schwer zu findenden Bugs führt. Halte deinen Scope so klein wie möglich.
// Globale Variable - kann überall geändert werden
let counter = 0;
function increment() {
counter++;
}
// Gekapselt - kontrollierter Zugriff
function createCounter() {
let counter = 0;
return {
increment() {
counter++;
return counter;
}
};
}
Häufige Fehler
1. Variable nicht deklariert
Wenn du eine Variable verwendest, ohne sie zu deklarieren, wird sie automatisch global - das kann zu schwer zu findenden Bugs führen.
// Immer deklarieren
function goodExample() {
const userName = "Anna-Maria";
}
function badExample() {
// Keine Deklaration - wird global!
userName = "Anna-Maria"; // Im strict mode ein Fehler
}
Verwende immer "use strict"; am Anfang deiner Skripte. Das verhindert
viele
häufige Fehler, wie das versehentliche Erstellen globaler Variablen.
2. const mit einem Objekt verwechseln
Ein häufiger Anfängerfehler: const macht die Referenz konstant, nicht den
Inhalt!
const user = { name: "Anna-Maria" };
// Eigenschaft ändern
user.name = "Anna";
user.age = 25;
// Das funktioniert NICHT - neue Referenz zuweisen
user = { name: "Anna" }; // TypeError
// Gleiches gilt für Arrays:
const numbers = [1, 2, 3];
numbers.push(4); // Funktioniert
numbers = [5, 6]; // TypeError
3. Scope-Verwirrung mit var
Ein klassisches Problem mit var in Schleifen:
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i); // Gibt dreimal "3" aus - nicht 0, 1, 2!
}, 100);
}
// Lösung: Block Scope
for (let i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i); // Gibt 0, 1, 2 aus - wie erwartet!
}, 100);
}
4. Variable nicht initialisiert
Wenn du let ohne Wert deklarierst, ist die Variable undefined.
Bei
const MUSST du sofort einen Wert zuweisen.
// ist undefined
let userName;
console.log(userName); // undefined
userName = "Anna-Maria"; // Später zuweisen ist OK
// SyntaxError: Missing initializer in const declaration
const siteName;
// Der Wert MUSS sofort zugewiesen werden
const siteName = "DevPanicZone";
Interaktive Demos
Demo 1: const vs let
Teste selbst den Unterschied zwischen const und let:
Klicke auf die Buttons, um zu sehen, was passiert...
Open JavaScript Demo 1
// Demo 1: const vs let
document.getElementById('demoConstBtn').addEventListener('click', function() {
const output = document.getElementById('demoOutput1');
try {
const CONSTANT_VALUE = "Ich bin konstant!";
CONSTANT_VALUE = "Versuch mich zu ändern!"; // Das gibt einen Fehler
} catch(error) {
output.innerHTML = `
<p class="error-message"><strong>❌ Fehler mit const:</strong></p>
<p>${error.message}</p>
<p>const-Variablen können nicht neu zugewiesen werden!</p>
`;
}
});
document.getElementById('demoLetBtn').addEventListener('click', function() {
const output = document.getElementById('demoOutput1');
let mutableValue = "Ich bin veränderbar!";
mutableValue = "Ich wurde geändert!";
output.innerHTML = `
<p class="success-message"><strong>✅ Erfolg mit let:</strong></p>
<p>Alter Wert: "Ich bin veränderbar!"</p>
<p>Neuer Wert: "${mutableValue}"</p>
<p>let-Variablen können neu zugewiesen werden!</p>
`;
});
document.getElementById('demoResetBtn').addEventListener('click', function() {
document.getElementById('demoOutput1').innerHTML = '<p>Klicke auf die Buttons, um zu sehen, was passiert...</p>';
});
Demo 2: Block Scope
Sieh dir an, wie Block Scope mit let und const funktioniert:
Klicke auf den Button, um den Scope zu testen...
Open JavaScript Demo 2
// Demo 2: Block Scope
document.getElementById('scopeTestBtn').addEventListener('click', function() {
const output = document.getElementById('demoOutput2');
let results = [];
// Globale Variable
const globalVar = "Ich bin global";
// Block Scope Test
if (true) {
const blockVar = "Ich bin im Block";
let blockLet = "Ich auch!";
results.push(`Innerhalb des Blocks:<br>globalVar = "${globalVar}"<br>blockVar = "${blockVar}"<br>blockLet = "${blockLet}"`);
}
// Außerhalb des Blocks
results.push(`Außerhalb des Blocks:<br>globalVar = "${globalVar}"`);
try {
console.log(blockVar); // Das gibt einen Fehler
} catch(error) {
results.push(`<span class="error-message">blockVar ist außerhalb nicht verfügbar! (ReferenceError)</span>`);
}
output.innerHTML = results.join('<br><br>');
});
Demo 3: Variable Counter
Ein einfacher Counter mit let:
Counter: 0
Open JavaScript Demo 3
// Demo 3: Counter
let counter = 0;
document.getElementById('incrementBtn').addEventListener('click', function() {
counter++;
document.getElementById('counterValue').textContent = counter;
});
document.getElementById('decrementBtn').addEventListener('click', function() {
counter--;
document.getElementById('counterValue').textContent = counter;
});
document.getElementById('resetCounterBtn').addEventListener('click', function() {
counter = 0;
document.getElementById('counterValue').textContent = counter;
});
Zusammenfassung
- const für Werte, die sich nicht ändern sollen - verwende dies als Standard
- let für Werte, die sich ändern können - nur wenn wirklich nötig
- var vermeiden - es gibt keinen Grund mehr, var zu verwenden
- Block Scope: let und const respektieren Block Scope, var nicht
- Hoisting: Deklarationen werden nach oben gehoben, aber let/const sind vor der Deklaration nicht nutzbar
- Naming: Verwende camelCase und beschreibende Namen
- const mit Objekten: Die Referenz ist konstant, nicht der Inhalt
Nächste Schritte
Jetzt, wo du Variablen verstehst, kannst du weitermachen mit:
- Data Types - Welche Datentypen gibt es in JavaScript?
- Operators - Wie du mit Werten rechnest und vergleichst
- Functions - Wie du wiederverwendbaren Code schreibst
- Control Flow - if/else, switch, und Entscheidungen treffen
Öffne die Browser-Konsole Cmd + Opt + I / F12 und teste verschiedene Variablen-Deklarationen. Spiele mit const und let herum, probiere aus, was funktioniert und was nicht. Experimentieren ist der beste Weg zu lernen!
Mehr aus JavaScript
Tutorials werden geladen...