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 Variable
  • const → fester Wert, der nicht neu zugewiesen werden darf
JavaScript
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 anlegen
  • userName → So heißt die Schublade (sprechend)
  • = → Der Wertzuweisungs-Operator („Lege diesen Wert hinein“)
  • "Anna-Maria" Der Wert
  • ; → Satzende
JavaScript
// 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
JavaScript
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

JavaScript
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

JavaScript
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
JavaScript
// 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!)
Deshalb funktioniert das

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)
Hinweis

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.

javascript
// 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:

javascript
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.

javascript
// 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.

javascript
// 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
Best Practice

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.

javascript
// 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.

javascript
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!

javascript
// 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!
Warum ist Block Scope wichtig?

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.

javascript
// 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.

javascript
// 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";
Best Practice

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:

Grundregeln
  • 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: userName und username sind verschiedene Variablen
Gute Variablennamen
let userName = "Anna-Maria";
let userAge = 25;
let isLoggedIn = true;
let _privateVar = "internal";
let $element = document.querySelector(".test");
Schlechte Variablennamen
// 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:

javascript
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!

Nicht gut
let d = new Date();
let temp = users.filter(u => u.age > 18);
Viel besser
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
// 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
// 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.

Alle Variablen am Anfang
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.

Alt und problematisch
var count = 0;
Modern und sicher
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
// Verwirrend: Variable wird für verschiedene Dinge benutzt
let data = fetchUsers();
data = data.filter(u => u.active);
data = data.map(u => u.name);
Klar
// 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
// Globale Variable - kann überall geändert werden
let counter = 0;

function increment() {
    counter++;
}
Gekapselt
// 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
// Immer deklarieren
function goodExample() {
    const userName = "Anna-Maria";
}
Keine Deklaration
function badExample() {
    // Keine Deklaration - wird global!
    userName = "Anna-Maria"; // Im strict mode ein Fehler
}
Tipp

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!

Das funktioniert
const user = { name: "Anna-Maria" };

// Eigenschaft ändern
user.name = "Anna";
user.age = 25;
Das funktioniert NICHT
// 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:

Problem mit var
for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i); // Gibt dreimal "3" aus - nicht 0, 1, 2!
    }, 100);
}
Lösung mit let
// 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.

let ohne Wert
// ist undefined
let userName;
console.log(userName); // undefined
userName = "Anna-Maria"; // Später zuweisen ist OK
const MUSS sofort einen Wert haben
// SyntaxError: Missing initializer in const declaration
const siteName;
const immer mit Wert
// 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
JavaScript
// 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
JavaScript
// 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
JavaScript
// 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

Die wichtigsten Punkte
  • 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
Tipp zum Üben

Ö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...