Menu

JavaScript Strict Mode: Was 'use strict' wirklich bewirkt

Was sich im Strict Mode von JavaScript ändert, wie du ihn aktivierst – und warum moderner Code mit Modulen und Klassen ihn automatisch nutzt.

Strict Mode ist eine strengere Variante von JavaScript

JavaScript hat eine lange Geschichte hinter sich – und damit auch jede Menge fragwürdiger Designentscheidungen: Zuweisungen, die stillschweigend globale Variablen anlegen, ein this, das je nach Aufrufart seine Bedeutung wechselt, doppelte Parameternamen, die einfach... funktionierten. An diesen Dingen etwas zu ändern würde das halbe Web zerschießen, deshalb hat TC39 (das Komitee, das die Sprache pflegt) einen anderen Weg gewählt: einen Opt-in-Modus, in dem die scharfen Kanten entschärft werden.

Dieses Opt-in nennt sich Strict Mode. Aktivieren lässt es sich mit einer einzigen Zeile am Anfang einer Datei oder Funktion:

index.js
Output
Click Run to see the output here.

Wenn du das ausführst, bekommst du einen ReferenceError: x is not defined. Ohne die Direktive legt derselbe Code fröhlich eine globale Variable namens x an und gibt 10 aus. Gleiche Sprache, zwei völlig verschiedene Spielregeln.

Die 'use strict' Direktive

Die Direktive ist einfach ein String-Literal — 'use strict'; oder "use strict";. Sie muss die erste Anweisung im Script oder in der Funktion sein. Sobald davor irgendetwas steht, sei es auch nur ein loser Ausdruck, behandelt die Engine sie als ganz normalen String und ignoriert sie.

index.js
Output
Click Run to see the output here.

Du kannst den Strict Mode auch nur auf eine einzelne Funktion beschränken, indem du die Direktive direkt in ihr platzierst. In der Praxis macht das aber niemand mehr — entweder du schreibst Module (die sind ohnehin standardmäßig strict) oder du schaltest gleich die ganze Datei um.

Was der Strict Mode konkret verändert

Strict Mode ist keine einzelne Regel, sondern ein ganzes Paket an Änderungen. Die wichtigsten Punkte:

  • Die Zuweisung an eine undeklarierte Variable wirft einen Fehler, statt still eine globale Variable anzulegen.
  • this ist bei einem normalen Funktionsaufruf undefined und nicht mehr das globale Objekt.
  • Doppelte Parameternamen (function f(a, a) {}) sind ein Syntaxfehler.
  • Zuweisungen an schreibgeschützte Properties werfen einen Fehler, statt stillschweigend fehlzuschlagen.
  • Das Löschen einer normalen Variable oder Funktion wirft einen Fehler.
  • Einige für die Zukunft reservierte Wörter (implements, interface, package, private, protected, public, static, yield) dürfen nicht als Variablennamen verwendet werden.

Ein kleiner Rundgang:

index.js
Output
Click Run to see the output here.

Jeder dieser Fälle läuft nach demselben Muster: „Die Engine hat einen wahrscheinlichen Fehler frühzeitig bemerkt." Genau darin liegt der Mehrwert.

Der stille globale Variablen-Bug

Das ist der Hauptgrund, warum es Strict Mode in JavaScript überhaupt gibt. Ohne 'use strict' wird aus einem Tippfehler schnell mal eine globale Variable:

// Nicht-strikter Modus (mach das nicht)
function setup() {
    usernmae = 'Ada';   // Tippfehler – erzeugt window.usernmae
}

setup();
console.log(username);  // undefined – die echte Variable wurde nie gesetzt

Das Programm läuft. Kein Fehler. Der Bug taucht erst später auf – wenn irgendetwas, das eigentlich username lesen sollte, plötzlich auf undefined stößt. Im Strict Mode knallt genau dieser Tippfehler sofort beim Ausführen, und du behebst ihn in Sekunden statt in Stunden.

Modernes JavaScript läuft standardmäßig im Strict Mode

Und jetzt kommt der Punkt, über den viele stolpern: Der meiste JavaScript-Code, den du heute schreibst, läuft sowieso schon im Strict Mode – ganz ohne dass du 'use strict' irgendwo hingeschrieben hast.

Zwei große Quellen für diese automatische Strenge:

  • ES Module. Jede .mjs-Datei, jedes <script type="module"> und alles, was über import/export eingebunden wird, läuft automatisch im Strict Mode. Ohne Direktive, ohne alles.
  • Klassenrümpfe. Jede Anweisung innerhalb von class { ... } ist strict – selbst dann, wenn die umgebende Datei es nicht ist.
index.js
Output
Click Run to see the output here.

Wann musst du 'use strict'; also tatsächlich selbst hinschreiben? Nur in klassischen Skripten — also altmodischem JS, das per simplem <script>-Tag geladen wird, oder in älteren Node.js-Dateien, die mit require ohne Modul-Bundling arbeiten. Bei allem, was du neu schreibst, übernehmen Module diese Aufgabe für dich.

Strict Mode verändert this in normalen Funktionen

Ein Verhalten, das besonders erwähnt werden muss, weil es Einsteiger regelmäßig auf dem falschen Fuß erwischt. Im Non-Strict-Mode zeigt this beim Aufruf einer normalen Funktion ohne vorangestelltes Objekt auf das globale Objekt (window im Browser, global in Node). Im Strict Mode ist this dagegen undefined:

index.js
Output
Click Run to see the output here.

Das ist in aller Regel genau das, was man will. Wenn this den Wert undefined hat, fällt ein vergessenes Method-Binding sofort auf. Zeigt es dagegen stillschweigend aufs globale Objekt, versteckt sich der Bug so lange, bis an einer ganz anderen Stelle etwas kaputtgeht.

Was der Strict Mode nicht leistet

Der Strict Mode zieht die Regeln zur Compile- und Laufzeit etwas straffer an — aber er bringt dir weder Typen, noch warnt er vor Null-Zugriffen oder ungenutzten Variablen. Dafür sind TypeScript, ESLint und dein Editor zuständig. Sieh den Strict Mode eher als Korrektiv für ein paar bekannte Fallstricke auf Sprachebene, nicht als komplettes Sicherheitsnetz.

Er ist auch nicht gleichbedeutend mit „modernem JavaScript". Man kann im Strict Mode grauenhaften Code schreiben und ohne die Direktive hervorragenden. Er macht lediglich ein paar konkrete Fehler schwerer zu begehen.

Das Wichtigste auf einen Blick

  • 'use strict'; am Anfang einer Datei oder Funktion aktiviert eine strengere Variante von JavaScript.
  • Tippfehler erzeugen keine globalen Variablen mehr, this wird nicht mehr klammheimlich zum globalen Objekt, und einige weitere Fallstricke werfen jetzt Fehler.
  • ES Modules und class-Bodies laufen automatisch im Strict Mode — die Direktive musst du dort praktisch nie selbst hinschreiben.
  • Es geht darum, Bugs früher zu erwischen, nicht darum, neue Features freizuschalten.

Weiter geht's: Kommentare

Du kennst jetzt Direktiven, Semikolons und die Regeln, auf die die Engine Wert legt. Als Nächstes dran: die Notizen, die du für künftige Leser hinterlässt — wie Kommentare in JavaScript funktionieren und wann sie sich wirklich lohnen.

Häufig gestellte Fragen

Was ist der Strict Mode in JavaScript?

Der Strict Mode ist eine optionale Variante von JavaScript, die aus einer Handvoll stillschweigender Fehler echte Fehlermeldungen macht. Aktiviert wird er, indem du den String 'use strict'; ganz an den Anfang einer Datei oder Funktion stellst. Die Sprache wird dadurch strenger: Die Zuweisung an eine nicht deklarierte Variable wirft einen Fehler, doppelte Parameternamen sind verboten, und this in einem normalen Funktionsaufruf ist undefined statt des globalen Objekts.

Wie aktiviere ich den Strict Mode in JavaScript?

Schreib 'use strict'; als allererste Anweisung eines Skripts oder einer Funktion. Davor darf wirklich nichts stehen – nicht mal eine leere Zeile ohne Kommentar –, sonst wird die Zeile nur als gewöhnlicher String behandelt. In modernem Code musst du das ohnehin kaum noch selbst schreiben: ES-Module (also .mjs-Dateien oder <script type="module">) und der Body jeder class laufen automatisch im Strict Mode.

Warum sollte man den Strict Mode in JavaScript nutzen?

Weil er Bugs früher sichtbar macht. Ein Tippfehler wie usernmae = 'Ada' legt ohne Strict Mode klammheimlich eine globale Variable an – mit Strict Mode gibt's einen ReferenceError. Außerdem reserviert der Strict Mode zukünftige Schlüsselwörter, verbietet doppelte Property-Namen in älteren Engines und sorgt dafür, dass sich this vorhersehbar verhält. Alles zusammen macht den Code deutlich leichter nachvollziehbar.

Brauche ich 'use strict' in modernem JavaScript überhaupt noch?

In der Regel nein. ES-Module und class-Bodies sind standardmäßig strict, und die meisten modernen Projekte bestehen aus genau diesen beiden. Explizit 'use strict'; schreiben musst du eigentlich nur noch in klassischen Skripten alter Bauart – also solchen, die per normalem <script>-Tag ohne type="module" eingebunden werden.

Lerne mit Coddy zu programmieren

LOS GEHT'S