In ihrer Besessenheit, die numerischen Literale auszurichten, hat der Entwickler die Variable versehentlich b
mit einem oktalen Literal initialisiert . Im nicht strengen Modus wird dies als numerisches Literal mit Wert 24
(in Basis 10) interpretiert . Der strikte Modus löst jedoch einen Fehler aus.
Umfang
In der Vergangenheit war JavaScript verwirrt darüber, wie Funktionen funktionieren. Manchmal scheinen sie statisch zu sein, aber bei einigen Funktionen verhalten sie sich so, als wären sie dynamisch. Dies ist verwirrend und erschwert das Lesen und Verstehen von Programmen. Missverständnisse verursachen Fehler. Es ist auch ein Problem für die Leistung. Das statische Scoping würde eine variable Bindung zur Kompilierungszeit ermöglichen, aber die Anforderung eines dynamischen Bereichs bedeutet, dass die Bindung auf die Laufzeit verschoben werden muss, was mit einem erheblichen Leistungsverlust verbunden ist.
Im strengen Modus muss die gesamte Variablenbindung statisch erfolgen. Das bedeutet, dass die Funktionen, für die zuvor eine dynamische Bindung erforderlich war, entfernt oder geändert werden müssen. Insbesondere wird die with-Anweisung eliminiert und die Fähigkeit der eval-Funktion, die Umgebung ihres Aufrufers zu manipulieren, ist stark eingeschränkt.
Einer der Vorteile von striktem Code besteht darin, dass Tools wie YUI Compressor
bei der Verarbeitung bessere Arbeit leisten können.
Implizierte globale Variablen
JavaScript hat globale Variablen impliziert. Wenn Sie eine Variable nicht explizit deklarieren, wird implizit eine globale Variable für Sie deklariert. Dies erleichtert Anfängern das Programmieren, da sie einige ihrer grundlegenden Hausarbeiten vernachlässigen können. Dies erschwert jedoch die Verwaltung größerer Programme erheblich und beeinträchtigt die Zuverlässigkeit erheblich. Im strengen Modus werden implizite globale Variablen nicht mehr erstellt. Sie sollten alle Ihre Variablen explizit deklarieren.
Globale Leckage
Es gibt eine Reihe von Situationen, die dazu führen können this
, dass Sie an das globale Objekt gebunden sind. Wenn Sie beispielsweise vergessen, new
beim Aufrufen einer Konstruktorfunktion das Präfix anzugeben, wird der Konstruktor this
unerwartet an das globale Objekt gebunden. Statt ein neues Objekt zu initialisieren, werden globale Variablen stillschweigend manipuliert. In diesen Situationen wird die Strict - Modus statt binden this
an undefined
, die den Konstruktor verursacht eine Ausnahme statt zu werfen, so dass der Fehler viel früher erkannt werden.
Lauter Fehler
JavaScript hatte immer schreibgeschützte Eigenschaften, aber Sie konnten sie nicht selbst erstellen, bis die ES5- Object.createProperty
Funktion diese Funktion verfügbar machte . Wenn Sie versuchen, einer schreibgeschützten Eigenschaft einen Wert zuzuweisen, schlägt dies unbemerkt fehl. Die Zuweisung würde den Wert der Eigenschaft nicht ändern, aber Ihr Programm würde so ablaufen, als ob es dies getan hätte. Dies ist ein Integritätsrisiko, das dazu führen kann, dass Programme in einen inkonsistenten Zustand versetzt werden. Im strengen Modus wird beim Versuch, eine schreibgeschützte Eigenschaft zu ändern, eine Ausnahme ausgelöst.
Oktal
Die oktale (oder Basis 8) Darstellung von Zahlen war äußerst nützlich, wenn Sie auf Maschinenebene auf Maschinen programmierten, deren Wortgröße ein Vielfaches von 3 war. Sie benötigten Oktal, wenn Sie mit dem CDC 6600-Mainframe arbeiteten, der eine Wortgröße von 60 Bit hatte. Wenn Sie Oktal lesen könnten, könnten Sie ein Wort als 20-stellig betrachten. Zwei Ziffern stellten den Operationscode dar, und eine Ziffer identifizierte eines von 8 Registern. Während des langsamen Übergangs von Maschinencodes zu Hochsprachen wurde es als nützlich erachtet, Oktalformen in Programmiersprachen bereitzustellen.
In C wurde eine äußerst unglückliche Darstellung der Oktalität gewählt: Führende Null. In C 0100
bedeutet dies also 64, nicht 100 und 08
ist ein Fehler, nicht 8. Leider wurde dieser Anachronismus in fast alle modernen Sprachen kopiert, einschließlich JavaScript, wo er nur zum Erstellen von Fehlern verwendet wird. Es hat keinen anderen Zweck. Im strengen Modus sind Oktalformen also nicht mehr zulässig.
Und so weiter
Das Argument-Pseudo-Array wird in ES5 etwas Array-ähnlicher. Im strengen Modus verliert es seine callee
und caller
Eigenschaften. Dies ermöglicht es Ihnen arguments
, Ihren nicht vertrauenswürdigen Code weiterzugeben , ohne viel vertraulichen Kontext aufzugeben. Auch die
arguments
Eigenschaft von Funktionen entfällt.
Im strengen Modus führen doppelte Schlüssel in einem Funktionsliteral zu einem Syntaxfehler. Eine Funktion kann nicht zwei Parameter mit demselben Namen haben. Eine Funktion kann keine Variable mit demselben Namen wie einer ihrer Parameter haben. Eine Funktion kann keine delete
eigenen Variablen haben. Ein Versuch zu
delete
einer nicht konfigurierbaren Eigenschaft löst jetzt eine Ausnahme aus. Primitive Werte werden nicht implizit umbrochen.
ECMAScript 5 fügt eine Liste reservierter Wörter hinzu. Wenn Sie sie als Variablen oder Argumente verwenden, gibt der strikte Modus einen Fehler aus. Die reservierten Wörter sind: