Was ist "use strict" in JavaScript und warum wird darüber diskutiert?
\n\nHaben Sie jemals JavaScript-Code geschrieben, der sich "irgendwie seltsam" verhalten hat? Eine Variable hat sich von selbst deklariert, this zeigte auf das globale Objekt, statt auf das, was Sie erwartet haben, und ein Fehler wurde einfach stillschweigend geschluckt? Willkommen in der Welt des "schmutzigen" JS.
Die Direktive "use strict" ist weder eine Funktion noch ein Operator. Sie ist buchstäblich ein Modusschalter für Ihr Skript oder Ihre Funktion. Wenn Sie "use strict" am Anfang einer Datei oder Funktion schreiben, sagen Sie der JavaScript-Engine: "Hey, vergib mir meine Fehler nicht. Sei strenger, aber ehrlicher."
Dieses Thema ist eine der beliebtesten Fragen auf Stack Overflow (tausende Aufrufe). Lassen Sie uns analysieren, was der strikte Modus genau bewirkt, warum er erfunden wurde und wie Sie mit seiner Hilfe vermeiden, sich ins eigene Bein zu schießen.
\n\nWie schaltet man den strikten Modus ein?
\n\nEs gibt nur zwei Möglichkeiten:
\n\n- \n
- Global (für das gesamte Skript):
"use strict";in der ersten Zeile der Datei. \n - Lokal (für eine Funktion):
"use strict";in der ersten Zeile des Funktionskörpers. \n
// Globaler strikter Modus\n"use strict";\nlet x = 10;\n\n// Lokaler strikter Modus\nfunction myFunc() {\n "use strict";\n let y = 20;\n}\n\nWichtig: Wenn Sie strikten und nicht-strikten Code in derselben Datei mischen (z.B. Skripte zusammenfügen), können Probleme auftreten. Es ist besser, den strikten Modus für einzelne Funktionen oder Module zu verwenden (ES6-Module sind automatisch strikt).
\n\nDie Top-5 Fehler, die "use strict" verhindert
\n\nDas Hauptziel von "use strict" ist es, "stille" JavaScript-Fehler in explizite Ausnahmen (Fehler, die ausgelöst und abgefangen werden können) umzuwandeln. Hier sind die 5 häufigsten Fälle.
1. Verbot der impliziten Erstellung globaler Variablen
\n\nDas ist ein Klassiker. Im normalen Modus wird eine Variable automatisch global, wenn Sie vergessen, var, let oder const zu schreiben. Dies kann zu schwer auffindbaren Bugs führen.
// Ohne "use strict"\nfunction sum(a, b) {\n total = a + b; // Fehler? Nein. total wurde zu einer globalen Variable!\n}\nsum(2, 3);\nconsole.log(total); // 5 — funktioniert, aber das ist schrecklich.\n\n// Mit "use strict"\n"use strict";\nfunction sumStrict(a, b) {\n total = a + b; // ReferenceError: total is not defined\n}\nsumStrict(2, 3); // Fehler! Der Code stürzt sofort ab.\n\nWie vermeiden? Deklarieren Sie Variablen immer. Verwenden Sie let und const anstelle von var, um Hoisting und versehentliche globale Variablen zu vermeiden.
2. Zuweisung von Werten an nicht beschreibbare Eigenschaften
\n\nIm normalen Modus ignoriert JavaScript stillschweigend den Versuch, NaN, undefined oder ein eingefrorenes Objekt zu ändern. Im strikten Modus wird ein Fehler ausgelöst.
"use strict";\n\n// Versuch, NaN zu überschreiben\nNaN = 123; // TypeError: Cannot assign to read only property 'NaN'\n\n// Versuch, ein eingefrorenes Objekt zu ändern\nconst obj = Object.freeze({name: "Alice"});\nobj.name = "Bob"; // TypeError: Cannot assign to read only property 'name'\n\nWie vermeiden? Versuchen Sie nicht, eingebaute Konstanten zu überschreiben. Verwenden Sie Object.freeze() bewusst.
3. Löschen von Variablen, Funktionen und Argumenten
\n\nSie können eine mit var oder let deklarierte Variable oder eine Funktion nicht löschen. Im normalen Modus wird dies einfach ignoriert.
"use strict";\n\nvar x = 10;\ndelete x; // SyntaxError: Delete of an unqualified identifier in strict mode.\n\nfunction foo() {}\ndelete foo; // SyntaxError\n\nWie vermeiden? Verwenden Sie delete nicht für Variablen. Es wird nur zum Löschen von Objekteigenschaften benötigt: delete obj.prop.