Du siehst es in altem Markup, in kuriosen href-Attributen oder in historischen Codebeispielen: Void(0). Was auf den ersten Blick wie ein obskurer Zauberspruch wirkt, ist in Wahrheit ein konkreter JavaScript-Ausdruck – und ein Relikt aus einer Zeit, in der wir Browser mit Workarounds bändigen mussten. Hier erfährst du präzise, was void macht, warum void(0) entstand, welche Nebeneffekte und Risiken damit einhergehen und wie du es in modernen Projekten ersetzt.
Was der void-Operator tatsächlich macht
Der unäre void-Operator in JavaScript evaluiert einen Ausdruck und liefert immer den Wert undefined zurück – unabhängig vom Ergebnis des ausgewerteten Ausdrucks. Das heißt:
Merksatz:
void Eführt E aus (inklusive etwaiger Seiteneffekte) und gibt garantiertundefinedzurück.
Daraus ergibt sich, dass die gebräuchliche Form void(0) nur ein Idiom ist: Der Operand 0 ist trivial, die Klammerung steigert die Lesbarkeit. Äquivalent wären void 0, void(1) oder void "egal". Geschichtlich wurde void(0) als gut lesbarer, „sicherer“ Weg genutzt, um verlässlich undefined zu erzeugen – selbst in Umgebungen, in denen das globale undefined früher überschreibbar war.
Wichtig: void ist ein Operator, kein Typ wie in C oder Java. JavaScript hat historisch Begriffe aus der C-Familie entlehnt, aber semantisch anders gefüllt.
Operator-Priorität und syntaktische Details
- Priorität:
voidhat eine hohe Priorität (wie andere unäre Operatoren). - Klammern:
void(0)ist stilistisch üblich;void 0ist identisch. - Seiteneffekte: In
void fn()wirdfn()ausgeführt; nur der Rückgabewert wird verworfen.
// Beispiele
void 0; // => undefined
void (1 + 2); // Evaluiert 3, liefert undefined
void function(){ }(); // IIFE, Rückgabewert explizit unterdrückt
Warum void(0) in href und javascript:-URLs landete
Historisch erlaubte HTML, JavaScript direkt als URL zu verwenden: href="javascript:...code...". Browser führten den Code aus und behandelten den Rückgabewert so:
- Gibt der Code eine Zeichenkette zurück, konnte der Browser diese als Dokumentinhalt behandeln (und rendern).
- Gibt der Code etwas „Nicht-Anzeigbares“ wie
undefinedzurück, wurde üblicherweise nicht navigiert.
An dieser Stelle kommt void(0) ins Spiel. Beispiel:
<a href="javascript:void(0)" onclick="doSomething()">Klick mich</a>
Durch void(0) wird die Navigation unterdrückt, während der onclick-Handler die eigentliche Aktion ausführt. Das war praktisch, aber führte zu Unschärfen:
- Link sieht aus wie Navigation, verhält sich aber wie ein Button.
- Statusleiste zeigte teils
javascript:-Code statt einer Ziel-URL. - Manche Browser erzeugten History-Side-Effekte.
Kurz gesagt:
void(0)war ein Werkzeug, um die Navigation injavascript:-Links zu verhindern – nicht mehr und nicht weniger.

Abgrenzung: Was void(0) nicht ist
Viele verwechseln void(0) mit return false, #, null oder undefined. Diese Dinge sind nicht austauschbar. Die Tabelle fasst zentrale Unterschiede zusammen:
| Konzept | Kontext | Wirkung | Typische Nutzung | Heute empfohlen? |
|---|---|---|---|---|
void(0) |
JS-Ausdruck, oft in javascript:-URLs |
Evaluiert Operand, gibt garantiert undefined zurück |
href="javascript:void(0)" zur Navigationsunterdrückung |
Nein (veraltet/anti-pattern) |
return false |
Inline-Handler/Bibliotheken | Verhindert häufig Default-Aktion und bubbling (je nach Umfeld) | Inline-onclick oder jQuery-Handler |
Eher nein; nutze event.preventDefault() |
# im href |
Link | Scrollt zur Seitenoberkante bzw. Anker; erzeugt History-Eintrag | Dummy-Links | Nein; semantisch sauberere Alternativen nutzen |
null |
JS-Wert | Objektabsenz (bewusst leer) | APIs, die „kein Objekt“ signalisieren | Ja, aber kontextabhängig |
undefined |
JS-Wert | Kein zugewiesener Wert | Funktionen ohne return, fehlende Properties |
Ja; global schreibgeschützt (ES5+) |
Semantik, A11y und Nutzererfahrung: Link ist nicht gleich Button
Ein <a> element ist semantisch ein Navigationsziel. Ein <button> ist eine Aktion. Wenn du href="javascript:void(0)" nutzt, erzeugst du einen „falschen Link“: Er verspricht Navigation, liefert aber nur eine Aktion. Das ist problematisch für:
- Screenreader: Sie kündigen „Link“ an, aber es gibt kein Ziel. Das erschwert die Orientierung.
- Tastaturnutzung: Fokus/Reaktion passt semantisch nicht zu einer Aktion.
- Fallbacks: Ohne JS ist der Link nutzlos. Progressive Enhancement wird gebrochen.
Best Practice: Wenn es nicht navigiert, modellier es als
<button type="button">. Wenn es navigiert, nutze einen echten Link mit echtemhref– und verhindere die Navigation nur bei Bedarf im Event-Handler.
Sicherheitsaspekte: Warum javascript:-URLs (und damit void(0)) heute raus sind
Angriffsfläche: XSS über javascript:-URLs
javascript:-URLs sind ein XSS-Risikofaktor. Wenn Angreifer den Inhalt eines href kontrollieren, genügt es, anstelle von void(0) bösartigen Code zu platzieren. Das Problem ist nicht void, sondern die Ausführung über URLs selbst.
Content Security Policy (CSP)
Strenge CSPs verbieten Inline-Skripte und javascript:-URLs. In solchen Setups werden href="javascript:void(0)" entweder blockiert oder erzeugen Policy-Verstöße. Moderne, sicherheitsbewusste Anwendungen kommen ohne javascript:-URLs aus – und damit ohne den Bedarf für void(0) in Links.
Transparenz und Phishing-Prävention
Wenn ein Link nicht wirklich navigiert, sondern nur Code ausführt, ist das für Nutzer schwer vorhersehbar. Das kann Phishing und UI-Verwirrung begünstigen. Klare Semantik (Link navigiert, Button agiert) erhöht die Sicherheitstransparenz.

Moderne Alternativen: sauber, semantisch, sicher
Event-API: event.preventDefault() statt Zaubertricks
<a href="/ziel" id="actionLink">Aktion (mit Fallback)</a>
<script>
document.getElementById('actionLink').addEventListener('click', function (event) {
event.preventDefault(); // Navigation unterdrücken
doSomething(); // Deine Aktion
});
</script>
Ohne JavaScript navigiert der Link auf /ziel und bietet damit einen sinnvollen Fallback. Mit JavaScript verhinderst du gezielt die Standardaktion. Kein void(0) nötig, CSP-freundlich und semantisch sauber.
Buttons für Aktionen
<button type="button" id="actionButton">Aktion</button>
<script>
document.getElementById('actionButton').addEventListener('click', () => {
doSomething();
});
</script>
Der Button ist die richtige Wahl, wenn nichts navigiert. Screenreader kündigen korrekt eine Schaltfläche an, Fokusverhalten ist stimmig, und CSS lässt sich gezielt anwenden.
Verzicht auf Inline-Handler und javascript:-URLs
- Trenne Markup und Verhalten: Nutze externe JS-Dateien und
addEventListener. - Stärke Testbarkeit, Wartbarkeit und CSP-Konformität.
- Nutze progressive Enhancement oder Server-Fallbacks, wo sinnvoll.
Frameworks und SPAs
In React, Vue, Angular & Co. ist void(0) überflüssig. Routing übernimmt eine Link-Komponente, Aktionen sind Buttons oder Events:
// React
function ActionButton() {
const handleClick = () => doSomething();
return <button type="button" onClick={handleClick}>Aktion</button>;
}
Praktische Refactoring-Strategie: Raus aus dem void(0)-Labyrinth
Schritt 1: Finde die Muster
<a href="javascript:void(0)" ...><a href="#" onclick="...; return false;">- Inline-Handler (
onclick,onmouseover, …)
Schritt 2: Entscheide Semantik
- Navigation? Dann echter Link mit echtem
href. - Keine Navigation? Dann
<button type="button">.
Schritt 3: Binde Verhalten entkoppelt
- JS-Dateien,
addEventListener, Event-Delegation. - Keine Inline-Skripte. CSP im Blick behalten.
Schritt 4: Optionaler Fallback
- Wenn sinnvoll, bietet der Link ein serverseitiges Fallback (Progressive Enhancement).
Schritt 5: Teste A11y und History
- Screenreader-Labels, Fokus, Tastaturnavigation, History-Verhalten.
Beispiele aus der Praxis
Alt: Dummy-Link mit void(0)
<a href="javascript:void(0)" onclick="openSubmenu('produkte')">Produkte</a>
Neu: Button mit Event-Delegation
<ul id="menu">
<li><button type="button" data-submenu="produkte">Produkte</button></li>
<li><button type="button" data-submenu="dienstleistungen">Dienstleistungen</button></li>
<li><button type="button" data-submenu="kontakt">Kontakt</button></li>
</ul>
<script>
document.getElementById('menu').addEventListener('click', (e) => {
const btn = e.target.closest('button[data-submenu]');
if (!btn) return;
openSubmenu(btn.getAttribute('data-submenu'));
});
</script>
Alt: Bookmarklet mit explizitem void(0)
javascript:(function(){ alert('Bookmarklet aktiv'); })();void(0);
Neu: Bookmarklet minimalistischer (wenn überhaupt gewünscht)
javascript:(function(){ alert('Bookmarklet aktiv'); })();
Hinweis: Viele Browser und Unternehmens-Policies beschränken Bookmarklets inzwischen stark. Prüfe, ob ein Browser-Extension- oder DevTools-Workflow geeigneter ist.
Häufige Stolperfallen und wie du sie vermeidest
- „#“ als Dummy-URL: Erzeugt Scroll- und History-Nebenwirkungen. Vermeide es.
return falsein Inline-Handlern: Uneinheitlich (Default + Bubbling). Nutzeevent.preventDefault()+event.stopPropagation()gezielt und getrennt.- Inline-JS im
onclick: Erschwert CSP, Testbarkeit und Wartung – raus damit. - Falsche Semantik: Link vs. Button sauber trennen, ARIA-Rollen nur ergänzend nutzen, nicht als Ersatz für korrekte Elemente.
- Kein Fallback: Wenn es geschäftsrelevant ist, plane Progressive Enhancement ein.
Theorie-Ecke: Ausdrücke, Seiteneffekte, void als Marker
void ist ein Ausdrucksfilter: Er trennt Auswertung (inkl. Seiteneffekten) vom Wert. In expression-orientierten Konstellationen – etwa javascript:-URLs oder verketteten Ausdrücken – markierst du so explizit: „Nur Nebenwirkungen zählen, nicht der Wert“.
// Kommatausdruck mit void als „Abschluss“
someFn(), anotherFn(), void thirdFn(); // Gesamtwert: undefined
In modernem Code brauchst du das selten. Funktionen ohne return liefern ohnehin undefined, und in sauberen API-Designs wird die Notwendigkeit, Ergebnisse zu verwerfen, architektonisch reduziert.
Historischer Kontext: Warum das alles mal sinnvoll erschien
- Frühe Browser: Uneinheitliche Interpretation von
javascript:-Rückgabewerten. - Globale
undefined-Unsicherheit: Früher überschreibbar,void(0)war „sicher“. - Enge Verflechtung von Markup und Verhalten: Inline-Handler und
javascript:-URLs waren normal.
Mit ECMAScript 5 (schreibgeschütztes undefined), klareren DOM-APIs, strengen CSPs und Frameworks sind diese Gründe entfallen. Das erklärt, warum Void(0) heute vor allem in Legacy-Code auftaucht – und dort systematisch ersetzt werden sollte.
Vergleich auf einen Blick: Alt-Patterns vs. Moderne Patterns
| Alt-Pattern | Problem | Modernes Pattern | Vorteile |
|---|---|---|---|
<a href="javascript:void(0)" onclick="..."> |
Semantik-Link ohne Ziel, CSP-Risiko, Inline-Handler | <button type="button"> + addEventListener |
Saubere Semantik, testbar, CSP-freundlich |
<a href="#" onclick="return false"> |
History-/Scroll-Nebenwirkungen, uneindeutiges return false |
Echter <a href="/ziel"> + event.preventDefault() |
Fallback bleibt nutzbar, Verhalten klar steuerbar |
Inline-Events (onclick) |
Vermischung von Markup/Logik, CSP-Blockaden | Externe JS-Dateien, Event-Delegation | Bessere Wartbarkeit, Sicherheit, Struktur |
Best-Practices-Checkliste
- Nutze Buttons für Aktionen, Links für Navigation.
- Vermeide
javascript:-URLs und Inline-Handler. - Steuere Verhalten mit
addEventListenerundevent.preventDefault(). - Plane Progressive Enhancement und sinnvolle Fallbacks.
- Aktiviere CSP und halte dich daran (keine Ausnahmen für
unsafe-inline). - Teste A11y (Screenreader, Tastatur, Fokus), History und Statusanzeigen.
- Räume Legacy-Patterns wie
Void(0),#-Dummys,return falsesukzessive auf.
Fazit
void(0) ist sprachlich simpel, historisch bedeutsam – und im modernen Web nahezu überflüssig. Es diente einst dazu, bei javascript:-URLs eine Navigation zu verhindern und sicher undefined zu liefern. Heute widersprechen diese Muster gängigen Prinzipien: saubere Semantik (Button vs. Link), entkoppeltes Verhalten über Event-Listener, Progressive Enhancement und strenge Sicherheitsrichtlinien (CSP).
Wenn du in Legacy-Code auf Void(0) stößt, nutze das als Signal für Refactoring: Entscheide dich bewusst für Link oder Button, verbanne javascript:-URLs und Inline-Handler, und ersetze Navigationsunterdrückung durch event.preventDefault(). So steigerst du Barrierefreiheit, Sicherheit und Wartbarkeit – und bringst die Codebasis auf den Stand moderner Webentwicklung.
FAQ
- Ist Void(0) heute noch „falsch“?
-
Nicht „falsch“ im Sinne der Sprache –
voidist korrekt. Aber im Markup, speziell inhref="javascript:void(0)", ist es ein Anti-Pattern: semantisch unsauber, sicherheitlich fragwürdig und ohne Mehrwert gegenüber modernen Alternativen. - Wann darf ich
voidüberhaupt noch benutzen? -
Selten. In reinem JS kannst du
voidals stilistisches Mittel nutzen, um den Rückgabewert explizit zu verwerfen (z. B. in komplexen Ausdrucksketten). Praktisch ist das aber fast nie nötig. In URLs/Markup solltest du es vermeiden. - Was ist besser als
href="javascript:void(0)"? -
– Für Aktionen:
<button type="button">mit Event-Listenern.
– Für Navigation mit optionaler Unterdrückung:<a href="/ziel">+event.preventDefault()im Click-Handler.
– Keine Inline-Handler, keinejavascript:-URLs. - Warum nicht einfach
href="#"? -
#erzeugt History-/Scroll-Effekte und ist ebenso ein Dummy-Workaround. Semantisch ist es unsauber. Nutze stattdessen Buttons oder echtehref-Ziele mit kontrollierter Unterdrückung. - Ist
return falsegleichwertig zuevent.preventDefault()? -
Nein.
return falseverhält sich je nach Kontext/Bibliothek unterschiedlich (verhindert teils auch Bubbling). Nutzeevent.preventDefault()für die Standardaktion undevent.stopPropagation()separat fürs Bubbling – explizit und klar. - Was passiert, wenn meine Seite eine strenge CSP hat?
-
javascript:-URLs und Inline-Handler werden blockiert oder melden Verstöße. Dein Code wird brechen. Der Umstieg auf entkoppeltes JS, Event-Listener und externe Skripte ist dann Pflicht – undVoid(0)in Links hat keinen Platz mehr. - Spielt
void(0)in Bookmarklets noch eine Rolle? -
Eher historisch. Manche Bookmarklets nutzten
void(0), um Navigations-/Rückgabe-Effekte zu vermeiden. Moderne Browser und Policies schränken Bookmarklets jedoch ein. Wo möglich, setze auf Erweiterungen oder Entwickler-Tools. - Wie ersetze ich
href="javascript:void(0)"in einer großen Legacy-App schrittweise? -
1) Finde alle Vorkommen. 2) Kategorisiere: Navigation vs. Aktion. 3) Ersetze Aktionen durch Buttons, Navigation durch echte Links. 4) Verlege Verhalten in JS-Dateien, nutze
addEventListener. 5) Teste A11y, History und CSP. 6) Entferne Inline-Handler undjavascript:-URLs komplett. - Kann ich
undefinedgefahrlos direkt verwenden? -
Ja. Seit ES5 ist
undefinedschreibgeschützt. Der historische Grund, übervoid(0)„sicheres“undefinedzu erzeugen, ist entfallen.
