Verwendung von 'use strict';
macht Ihren Code nicht plötzlich besser.
Le site JavaScript Strict-Modus ist ein Merkmal in ECMAScript 5 . Sie können den Strict-Modus aktivieren, indem Sie dies am Anfang Ihres Skripts/ihrer Funktion deklarieren.
'use strict';
Wenn eine JavaScript-Engine dies sieht Richtlinie wird er den Code in einem speziellen Modus interpretieren. In diesem Modus werden Fehler angezeigt, wenn bestimmte Codierungspraktiken entdeckt werden, die sich als potenzielle Fehler herausstellen könnten (dies ist der Grund für den strengen Modus).
Betrachten Sie dieses Beispiel:
var a = 365;
var b = 030;
In seiner Besessenheit, die numerischen Literale aneinanderzureihen, hat der Entwickler versehentlich die Variable b
mit einem oktalen Literal. Der nicht-strikte Modus interpretiert dies als numerisches Literal mit dem Wert 24
(zur Basis 10). Im Strict-Modus wird jedoch ein Fehler ausgegeben.
Eine nicht erschöpfende Liste von Spezialitäten im strengen Modus finden Sie unter diese Antwort .
Wo sollte ich verwenden 'use strict';
?
-
In meinem neu JavaScript-Anwendung: Ganz genau! Der strikte Modus kann als Whistleblower verwendet werden, wenn Sie etwas Dummes mit Ihrem Code anstellen.
-
In meinem bestehende JavaScript-Code: Wahrscheinlich nicht! Wenn Ihr vorhandener JavaScript-Code Anweisungen enthält, die im Strict-Mode verboten sind, bricht die Anwendung einfach ab. Wenn Sie den Strict-Modus verwenden wollen, sollten Sie darauf vorbereitet sein, Ihren bestehenden Code zu debuggen und zu korrigieren. Aus diesem Grund mit 'use strict';
macht Ihren Code nicht plötzlich besser .
Wie verwende ich den strengen Modus?
-
Einfügen einer 'use strict';
Anweisung am Anfang Ihres Skripts:
// File: myscript.js
'use strict';
var a = 2;
....
Beachten Sie, dass alles in der Datei myscript.js
wird im strengen Modus interpretiert.
-
Oder, fügen Sie eine 'use strict';
Anweisung am Anfang Ihres Funktionskörpers:
function doSomething() {
'use strict';
...
}
Alles im lexikalische Reichweite der Funktion doSomething
wird im strengen Modus interpretiert. Das Wort lexikalische Reichweite ist hier wichtig. Zum Beispiel, wenn Ihr Streng Code ruft eine Funktion einer Bibliothek auf, die nicht streng wird nur Ihr Code im strikten Modus ausgeführt, nicht aber die aufgerufene Funktion. Siehe diese Antwort für eine bessere Erklärung.
Welche Dinge sind im strengen Modus verboten?
Ich habe eine schöner Artikel beschreibt einige Dinge, die im strengen Modus verboten sind (beachten Sie, dass dies keine vollständige Liste ist):
Umfang
Historisch gesehen war JavaScript verwirrt darüber, wie Funktionen skaliert werden. Manchmal scheinen sie statisch skaliert zu sein, aber einige Funktionen verhalten sie sich, als wären sie dynamisch skaliert. Dies ist verwirrend und macht Programme schwierig zu lesen und zu verstehen. Missverständnisse führen zu Fehlern. Es ist auch ein Problem für die Leistung. Statisches Scoping würde die Bindung von Variablen zur Kompilierzeit ermöglichen. Kompilierzeit, aber die Anforderung des dynamischen Scopings bedeutet, dass die Bindung auf die Laufzeit verschoben werden, was mit erheblichen Leistungseinbußen Einbußen mit sich bringt.
Der strikte Modus erfordert, dass alle Variablenbindungen statisch erfolgen. Das bedeutet, dass die Funktionen, die bisher eine dynamische Bindung erfordern, beseitigt oder geändert werden müssen. Konkret heißt die with-Anweisung eliminiert, und die Fähigkeit der eval-Funktion, die Umgebung Umgebung ihres Aufrufers zu manipulieren, ist stark eingeschränkt.
Einer der Vorteile von striktem Code ist, dass Werkzeuge wie YUI-Kompressor eine bessere Arbeit bei der Verarbeitung leisten kann.
Implizite globale Variablen
JavaScript verfügt über implizite globale Variablen. Wenn Sie eine Variable nicht explizit deklarieren, wird eine globale Variable implizit für Sie deklariert. Das macht das Programmieren einfacher für Anfängern die Programmierung, da sie einige ihrer grundlegenden Hausarbeiten vernachlässigen Aufgaben vernachlässigen. Aber es macht die Verwaltung größerer Programme viel schwieriger schwieriger und die Zuverlässigkeit sinkt erheblich. Deshalb werden im strikten Modus werden keine impliziten globalen Variablen mehr erstellt. Sie sollten alle Ihre Variablen explizit deklarieren.
Globale Leckage
Es gibt eine Reihe von Situationen, die dazu führen können this
die an das globale Objekt gebunden werden soll. Wenn Sie zum Beispiel vergessen die new
Präfix beim Aufruf einer Konstruktorfunktion, das Konstruktor's this
wird unerwartet an das globale Objekt gebunden, so dass anstatt ein neues Objekt zu initialisieren, wird es stattdessen globale Variablen manipuliert. In diesen Situationen bindet der Strict-Modus stattdessen binden this
a undefined
was dazu führt, dass der Konstruktor stattdessen eine Ausnahme auslöst, wodurch der Fehler viel früher erkannt wird.
Geräuschvolles Scheitern
JavaScript hat schon immer schreibgeschützte Eigenschaften gehabt, aber Sie konnte sie nicht selbst erstellen, bis ES5 die Object.createProperty
Funktion hat diese Fähigkeit offengelegt. Wenn Sie versuchten, einer schreibgeschützten Eigenschaft einen Wert zuzuweisen einer schreibgeschützten Eigenschaft zuzuweisen, würde dies stillschweigend fehlschlagen. Die Zuweisung würde den Wert der Eigenschaft nicht ändern, aber Ihr Programm würde so fortfahren als ob es das getan hätte. Dies ist ein Integritätsrisiko, das dazu führen kann, dass Programme in einen inkonsistenten Zustand geraten. Im Strict-Modus führt der Versuch, eine schreibgeschützte Eigenschaft zu ändern, wird eine Ausnahme ausgelöst.
Oktal
Die oktale (oder Basis 8) Darstellung von Zahlen war extrem bei der Programmierung auf Maschinenebene auf Maschinen, deren Wortgrößen ein Vielfaches von 3 waren. ein Vielfaches von 3 waren. Man brauchte oktal, wenn man mit dem CDC 6600 Mainframe, der eine Wortgröße von 60 Bit hatte. Wenn Sie lesen konnten oktal lesen konnte, konnte man ein Wort als 20 Ziffern betrachten. Zwei Ziffern standen für den Operationscode, und eine Ziffer bezeichnete eines von 8 Registern. Während des langsamen Übergang von Maschinencodes zu Hochsprachen wurde es für wurde es als nützlich erachtet, in Programmiersprachen oktale Formen zu verwenden.
In C war eine äußerst unglückliche Darstellung der Oktalzahl gewählt: Führende Null. Also in C, 0100
bedeutet 64, nicht 100, und 08
ist eine Fehler, nicht 8. Noch bedauerlicher ist, dass dieser Anachronismus in fast alle modernen Sprachen übernommen, einschließlich JavaScript, wo nur dazu verwendet wird, Fehler zu erzeugen. Er hat keinen anderen Zweck. Also im strict mode sind oktale Formen nicht mehr erlaubt.
Et cetera
Die Argumente Pseudo-Array wird ein wenig mehr Array-ähnlich in ES5. Im Strict-Modus verliert es seine callee
y caller
Eigenschaften. Dies ermöglicht es, Ihre arguments
zu nicht vertrauenswürdigen Code, ohne viel vertraulichen Kontext preiszugeben. Auch die arguments
Eigenschaft von Funktionen wird eliminiert.
Im strengen Modus führen doppelte Schlüssel in einem Funktionsliteral zu einer Syntaxfehler. Eine Funktion kann nicht zwei Parameter mit demselben Namen haben. Eine Funktion kann keine Variable mit demselben Namen haben wie einer ihrer Parameter haben. Eine Funktion kann nicht delete
seine eigenen Variablen. Ein Versuch, die delete
eine nicht konfigurierbare Eigenschaft löst jetzt eine Ausnahme aus. Primitive Werte werden nicht implizit umbrochen.
Reservierte Wörter für zukünftige JavaScript-Versionen
ECMAScript 5 fügt eine Liste von reservierten Wörtern hinzu. Wenn Sie diese als Variablen oder Argumente verwenden, wird im Strict-Modus ein Fehler ausgegeben. Die reservierten Wörter sind:
implements
, interface
, let
, package
, private
, protected
, public
, static
y yield
Weitere Lektüre
73 Stimmen
Die Antworten hier sind alt, aber sie sind falsch. Der Hauptgrund für den Strict-Modus war nicht, um Programmierfehler zu verhindern - es war, JavaScript lexikalisch skaliert zu machen, so dass es statisch analysierbar sein könnte :]
5 Stimmen
Und der Grund für die seltsame Syntax (magische Zeichenkette als Anweisung) ist die Abwärtskompatibilität mit älteren JavaScript-Engines. Die Idee des strengen Modus ist es, einige problematische JavaScript-Sprachkonstrukte zu verbieten, aber die Interpretation des Codes nicht zu ändern, so dass die Ausführung identisch ist, unabhängig davon, ob die JavaScript-Engine den strengen Modus tatsächlich unterstützt oder nicht.