• Skip to main content

veight.de

  • Digital

Void(0) in JavaScript: Bedeutung, Einsatz, Risiken und moderne Alternativen

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 E führt E aus (inklusive etwaiger Seiteneffekte) und gibt garantiert undefined zurü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: void hat eine hohe Priorität (wie andere unäre Operatoren).
  • Klammern: void(0) ist stilistisch üblich; void 0 ist identisch.
  • Seiteneffekte: In void fn() wird fn() 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 undefined zurü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 in javascript:-Links zu verhindern – nicht mehr und nicht weniger.


Void(0)

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+)
Siehe auch  Norton Login: Architektur, Sicherheit und Best Practices für deinen zuverlässigen Zugang

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 echtem href – 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.


Void(0)

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, …)
Siehe auch  Jimdo Webmail Login: So meldest du dich richtig an – Technik, Sicherheit, Fehleranalyse

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 false in Inline-Handlern: Uneinheitlich (Default + Bubbling). Nutze event.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 addEventListener und event.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 false sukzessive auf.
Siehe auch  televend login: Technik, Sicherheit und Recht im Überblick

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 – void ist korrekt. Aber im Markup, speziell in href="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 void als 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, keine javascript:-URLs.
Warum nicht einfach href="#"?
# erzeugt History-/Scroll-Effekte und ist ebenso ein Dummy-Workaround. Semantisch ist es unsauber. Nutze stattdessen Buttons oder echte href-Ziele mit kontrollierter Unterdrückung.
Ist return false gleichwertig zu event.preventDefault()?
Nein. return false verhält sich je nach Kontext/Bibliothek unterschiedlich (verhindert teils auch Bubbling). Nutze event.preventDefault() für die Standardaktion und event.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 – und Void(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 und javascript:-URLs komplett.
Kann ich undefined gefahrlos direkt verwenden?
Ja. Seit ES5 ist undefined schreibgeschützt. Der historische Grund, über void(0) „sicheres“ undefined zu erzeugen, ist entfallen.
  • Impressum
  • Datenschutz und Haftungsausschluss