javascript - node - use strict typescript




Was macht "use strict" in JavaScript und was ist der Grund dafür? (17)

Vor kurzem habe ich etwas von meinem JavaScript-Code durch Crockfords JSLint und es gab den folgenden Fehler:

Problem in Zeile 1, Zeichen 1: Fehlende Anweisung "use strict".

Bei einigen Recherchen wurde mir klar, dass einige Leute "use strict"; hinzufügen "use strict"; in ihren JavaScript-Code. Nachdem ich die Anweisung hinzugefügt hatte, wurde der Fehler nicht mehr angezeigt. Leider hat Google nicht viel von der Geschichte hinter dieser Zeichenfolge-Erklärung preisgegeben. Sicher muss es etwas damit zu tun haben, wie das JavaScript vom Browser interpretiert wird, aber ich habe keine Ahnung, wie der Effekt aussehen würde.

Also, was ist "use strict"; Alles, was bedeutet das und ist es noch relevant?

Reagiert einer der aktuellen Browser auf "use strict"; String oder ist es für die zukünftige Verwendung?


Verwenden Sie 'use strict'; macht Ihren Code nicht plötzlich besser.

Der strikte JavaScript-Modus ist eine Funktion in ECMAScript 5 . Sie können den strikten Modus aktivieren, indem Sie dies oben in Ihrem Skript / in Ihrer Funktion angeben.

'use strict';

Wenn eine JavaScript-Engine diese Anweisung erkennt , wird sie den Code in einem speziellen Modus interpretieren. In diesem Modus werden Fehler ausgelöst, wenn bestimmte Codierungspraktiken entdeckt werden, die möglicherweise zu potenziellen Fehlern führen (was der Grund für den strikten Modus ist).

Betrachten Sie dieses Beispiel:

var a = 365;
var b = 030;

In ihrer Besessenheit, die numerischen Literale aufzustellen, hat der Entwickler die Variable b mit einem Oktal-Literal initialisiert. Der nicht strikte Modus interpretiert dies als numerisches Literal mit dem Wert 24 (in der Basis 10). Im strikten Modus wird jedoch ein Fehler ausgegeben.

Eine nicht erschöpfende Liste von Spezialitäten im strikten Modus finden Sie in dieser Antwort .

Wo sollte ich 'use strict'; ?

  • In meiner neuen JavaScript-Anwendung: Absolut! Der strikte Modus kann als Whistleblower verwendet werden, wenn Sie mit Ihrem Code etwas Dummes tun.

  • In meinem vorhandenen JavaScript-Code: Wahrscheinlich nicht! Wenn Ihr vorhandener JavaScript-Code Anweisungen enthält, die im strikten Modus verboten sind, wird die Anwendung einfach beschädigt. Wenn Sie den strikten Modus wünschen, sollten Sie bereit sein, Ihren vorhandenen Code zu debuggen und zu korrigieren. Deshalb verwenden Sie 'use strict'; macht Ihren Code nicht plötzlich besser .

Wie verwende ich den strikten Modus?

  1. Fügen Sie ein 'use strict'; Aussage über Ihrem Skript:

    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....
    

    Beachten Sie, dass alles in der Datei myscript.js im strikten Modus interpretiert wird.

  2. Oder fügen Sie eine 'use strict'; Aussage über Ihrem Funktionskörper:

    function doSomething() {
        'use strict';
        ...
    }
    

    Alles im lexikalischen Funktionsumfang doSomething wird im strikten Modus interpretiert. Das Wort lexikalisch ist hier wichtig. Siehe diese Antwort für eine bessere Erklärung.

Welche Dinge sind im strikten Modus verboten?

Ich habe einen schönen Artikel gefunden , der einige Dinge beschreibt, die im strikten Modus verboten sind (beachten Sie, dass dies keine ausschließliche Liste ist):

Umfang

In der Vergangenheit wurde JavaScript durch den Umfang der Funktionen verwirrt. Manchmal scheinen sie statisch zu sein, aber einige Funktionen verhalten sich so, als wären sie dynamisch. Dies ist verwirrend und macht es schwierig, Programme zu lesen und zu verstehen. Missverständnis verursacht Fehler. Es ist auch ein Problem für die Leistung. Statisches Scoping würde die Bindung von Variablen zur Kompilierzeit ermöglichen, aber die Anforderung an einen dynamischen Bereich bedeutet, dass die Bindung auf die Laufzeit verschoben werden muss, was mit einem erheblichen Performance-Nachteil verbunden ist.

Der strikte Modus erfordert, dass alle Variablenbindungen statisch erfolgen. Das bedeutet, dass die Funktionen, die zuvor für die dynamische Bindung erforderlich waren, entfernt oder geändert werden müssen. Insbesondere wird die with-Anweisung entfernt und die Fähigkeit der eval-Funktion, die Umgebung ihres Aufrufers zu manipulieren, ist stark eingeschränkt.

Strikter Code bietet den Vorteil, dass Tools wie YUI Compressor bei der Verarbeitung eine bessere Leistung erbringen 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 den Anfängern die Programmierung, da sie einige grundlegende Haushaltsaufgaben vernachlässigen können. Dies erschwert jedoch die Verwaltung größerer Programme und beeinträchtigt die Zuverlässigkeit erheblich. Im strikten 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önnten, dass this an das globale Objekt gebunden ist. Wenn Sie beispielsweise vergessen, das new Präfix anzugeben, wenn Sie eine Konstruktorfunktion aufrufen, wird dies vom Konstruktor unerwartet an das globale Objekt gebunden. Statt ein neues Objekt zu initialisieren, manipuliert es stattdessen automatisch globale Variablen. In diesen Situationen bindet der strikte Modus dies stattdessen an undefined , wodurch der Konstruktor stattdessen eine Ausnahme auslöst, wodurch der Fehler viel früher erkannt wird.

Lautes Versagen

JavaScript hatte immer schreibgeschützte Eigenschaften. Sie konnten sie jedoch erst selbst erstellen, wenn die Object.createProperty Funktion von Object.createProperty Funktion Object.createProperty . Wenn Sie versucht haben, 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 vorgehen, als ob es gewesen wäre. Dies ist ein Integritätsrisiko, das dazu führen kann, dass Programme in einen inkonsistenten Zustand versetzt werden. Im strikten 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 auf Maschinenebene auf Maschinen programmiert wurde, deren Wortgrößen ein Vielfaches von 3 waren. Bei der Arbeit mit dem CDC 6600-Mainframe, der eine Wortgröße von 60 Bit hatte, war Oktal erforderlich. Wenn Sie Oktal lesen könnten, könnten Sie ein Wort mit 20 Ziffern 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ührender Nullpunkt. In C bedeutet 0100 64, nicht 100 und 08 ist ein Fehler, nicht 8. Außerdem wurde dieser Anachronismus in fast alle modernen Sprachen kopiert, einschließlich JavaScript, wo er nur zur Erzeugung von Fehlern verwendet wird. Es hat keinen anderen Zweck. Im strengen Modus sind also keine Oktalformen mehr zulässig.

Und so weiter

Das Argument-Pseudo-Array wird in ES5 etwas mehr Array-artig. Im strikten Modus verliert es seine callee und callee . Dadurch ist es möglich, Ihre arguments an nicht vertrauenswürdigen Code zu übergeben, ohne viel vertraulichen Kontext aufzugeben. Auch die arguments von Funktionen wird eliminiert.

Im strikten 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 einem ihrer Parameter haben. Eine Funktion kann keine eigenen Variablen delete . Beim Versuch, eine nicht konfigurierbare Eigenschaft zu delete jetzt eine Ausnahme ausgelöst. Primitive Werte werden nicht implizit umbrochen.

Reservierte Wörter für zukünftige JavaScript-Versionen

ECMAScript 5 fügt eine Liste der reservierten Wörter hinzu. Wenn Sie sie als Variablen oder Argumente verwenden, wird im strikten Modus ein Fehler ausgegeben. Die reservierten Wörter sind:

implements , interface , let , package , private , protected , public , static und yield

Lesen Sie weiter


Die Aussage "use strict"; weist den Browser an, den Strict-Modus zu verwenden. Hierbei handelt es sich um einen reduzierten und sichereren Funktionssatz von JavaScript.

Liste der Funktionen (nicht erschöpfend)

  1. Verbietet globale Variablen. (Fängt fehlende var Deklarationen und Tippfehler in Variablennamen ein)

  2. Lautlos fehlgeschlagene Zuweisungen werfen einen Fehler im strikten Modus (Zuweisung von NaN = 5; ).

  3. Versuche, nicht wiederherstellbare Eigenschaften zu löschen, werden ausgelöst ( delete Object.prototype ).

  4. Erfordert, dass alle Eigenschaftsnamen in einem Objektliteral eindeutig sind ( var x = {x1: "1", x1: "2"} ).

  5. Funktionsparameternamen müssen eindeutig sein ( function sum (x, x) {...} )

  6. Verbietet die oktale Syntax ( var x = 023; einige Devs gehen fälschlicherweise davon aus, dass eine vorangestellte Null die Zahl nicht ändert.)

  7. Verbietet das with Schlüsselwort

  8. eval im strikten Modus führt keine neuen Variablen ein

  9. Verbietet das Löschen von einfachen Namen ( delete x; )

  10. Verbietet die Bindung oder Zuordnung der Namen eval und arguments in jeglicher Form

  11. Im strengen Modus werden die Eigenschaften des arguments mit den Formalparametern nicht als Aliasnamen bezeichnet. (dh in function sum (a,b) { return arguments[0] + b;} Dies funktioniert, weil arguments[0] an a gebunden sind usw.).

  12. arguments.callee wird nicht unterstützt

[Ref: Strikter Modus , Mozilla Developer Network ]


Ein Wort der Vorsicht, Sie hart programmierten Programmierer: Das Anwenden von "use strict" auf vorhandenen Code kann gefährlich sein! Bei diesem Ding handelt es sich nicht um ein Gefühlsglückliches, fröhliches Gesicht, das Sie auf den Code setzen können, um ihn "besser" zu machen. Mit dem "use strict" -Pragma wirft der Browser plötzlich Ausnahmen an zufälligen Orten, die er noch nie geworfen hat, nur weil Sie an dieser Stelle etwas tun, das standardmäßiges / lockeres JavaScript glücklich erlaubt, aber strikte JavaScript-Abgriffe! Es kann sein, dass Verstöße gegen die Strenge in selten verwendeten Anrufen in Ihrem Code verdeckt werden, die nur dann eine Ausnahme auslösen, wenn sie schließlich ausgeführt werden - beispielsweise in der Produktionsumgebung, die Ihre zahlenden Kunden verwenden!

Wenn Sie den Sprung wagen, ist es eine gute Idee, neben umfangreichen Komponententests und einer streng konfigurierten JSHint-Buildaufgabe "use strict" anzuwenden, die Ihnen ein gewisses Vertrauen geben wird, dass es keine dunklen Ecken Ihres Moduls gibt, die explodieren werden schrecklich, nur weil Sie den Strict-Modus aktiviert haben. Oder, hey, hier ist eine weitere Option: Fügen Sie Ihrem Legacy-Code einfach "use strict" zu. Wahrscheinlich ist es auf diese Weise sicherer. Fügen Sie auf keinen Fall "use strict" zu Modulen hinzu, die Sie nicht besitzen oder pflegen, wie z. B. Module von Drittanbietern.

Ich denke, obwohl es ein tödlich eingesperrtes Tier ist, kann "use strict" gutes Zeug sein, aber man muss es richtig machen. Die beste Zeit, um streng zu gehen, ist, wenn Ihr Projekt auf der grünen Wiese ist und Sie bei Null anfangen. Konfigurieren Sie JSHint/JSLint alle Warnungen und Optionen so eng sind, wie es Ihrem Team möglich ist, ein gutes Build / Test / Assert-System wie Grunt+Karma+Chai , und erst dann beginnen alle Ihre neuen Module als "use strict" . Seien Sie darauf vorbereitet, viele kleine Fehler und Warnungen zu heilen. JSHint/JSLint Sie sicher, dass alle die Schwerkraft verstehen, indem Sie den Build für FAIL konfigurieren, wenn JSHint/JSLint Verstöße verursacht.

Mein Projekt war kein Greenfield-Projekt, als ich "use strict" . Infolgedessen ist meine IDE voller roter Flecken, weil ich die Hälfte meiner Module nicht "use strict" habe, und JSHint beschwert sich darüber. Es ist eine Erinnerung an mich, was ich in Zukunft tun sollte. Mein Ziel ist es, wegen aller fehlenden "use strict" -Statements rote Markierungen zu erhalten, aber das ist jetzt Jahre her.


Es ist eine neue Funktion von ECMAScript 5. John Resig hat eine schöne Zusammenfassung davon geschrieben.

Es ist nur eine Zeichenfolge, die Sie in Ihre JavaScript-Dateien einfügen (entweder oben in Ihrer Datei oder innerhalb einer Funktion). Sie sieht folgendermaßen aus:

"use strict";

Wenn Sie es jetzt in Ihren Code einfügen, sollte dies bei aktuellen Browsern keine Probleme verursachen, da es nur eine Zeichenfolge ist. Es kann in Zukunft zu Problemen mit Ihrem Code führen, wenn Ihr Code gegen das Pragma verstößt. Wenn Sie beispielsweise foo = "bar" ohne zuerst foo zu definieren, wird Ihr Code ausfallen ... was meiner Meinung nach eine gute Sache ist.


Ich möchte eine etwas fundiertere Antwort geben, die die anderen Antworten ergänzt. Ich hatte gehofft, die populärste Antwort zu bearbeiten, schlug aber fehl. Ich habe versucht, es so umfassend und vollständig wie möglich zu gestalten.

Weitere Informationen finden Sie in der MDN-Dokumentation .

"use strict" eine in ECMAScript 5 eingeführte Direktive.

Richtlinien ähneln Aussagen, unterscheiden sich jedoch.

  • use strict enthält keine Schlüsselwörter: Die Direktive ist eine einfache Ausdrucksanweisung, die aus einem speziellen String-Literal (in einfachen oder doppelten Anführungszeichen) besteht. JavaScript-Engines, die ECMAScript 5 nicht implementieren, sehen lediglich eine Ausdrucksanweisung ohne Nebeneffekte. Es wird erwartet, dass zukünftige Versionen der ECMAScript-Standards die use als echtes Schlüsselwort einführen. die Zitate würden damit überflüssig werden.
  • use strict kann nur am Anfang eines Skripts oder einer Funktion verwendet werden, dh es muss vor jeder anderen (echten) Anweisung stehen. Es muss nicht die erste Anweisung in einem Funktionsskript sein: Es können andere Anweisungsausdrücke vorangestellt werden, die aus String-Literalen bestehen (und JavaScript-Implementierungen können sie als implementierungsspezifische Anweisungen behandeln). String-Literals-Anweisungen, die auf eine erste echte Anweisung (in einem Skript oder einer Funktion) folgen, sind einfache Ausdrucks-Anweisungen. Dolmetscher dürfen sie nicht als Richtlinien interpretieren und haben keine Wirkung.

Die Anweisung use strict zeigt an, dass der folgende Code (in einem Skript oder einer Funktion) strikter Code ist. Der Code auf der höchsten Ebene eines Skripts (Code, der nicht in einer Funktion enthalten ist) wird als strikter Code betrachtet, wenn das Skript eine Anweisung für die use strict Anweisungen enthält. Der Inhalt einer Funktion wird als strikter Code betrachtet, wenn die Funktion selbst in einem strengen Code definiert ist oder wenn die Funktion eine Anweisung für eine use strict enthält. Code, der an eine eval() -Methode übergeben wird, gilt als strikter Code, wenn eval() von einem strengen Code aus aufgerufen wurde oder die Anweisung use strict selbst enthält.

Der strikte Modus von ECMAScript 5 ist eine eingeschränkte Teilmenge der JavaScript-Sprache, die relevante Sprachdefizite beseitigt und eine strengere Fehlerprüfung und höhere Sicherheit bietet. Im Folgenden sind die Unterschiede zwischen dem strikten Modus und dem normalen Modus aufgeführt (von denen die ersten drei besonders wichtig sind):

  • Sie können die with -statement nicht im strikten Modus verwenden.
  • Im strikten Modus müssen alle Variablen deklariert werden: Wenn Sie einem Bezeichner einen Wert zuweisen, der nicht als Variable, Funktion, Funktionsparameter, Catch-Klausel-Parameter oder Eigenschaft des globalen Object deklariert ist, erhalten Sie einen ReferenceError . Im Normalmodus wird der Bezeichner implizit als globale Variable (als Eigenschaft des globalen Object ) deklariert.
  • Im strikten Modus hat das Schlüsselwort den Wert in Funktionen, die als Funktionen (nicht als Methoden) aufgerufen wurden, undefined . (Im Normalmodus zeigt this immer auf das globale Object ). Dieser Unterschied kann verwendet werden, um zu testen, ob eine Implementierung den strikten Modus unterstützt:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Wenn eine Funktion mit call() oder apply im strikten Modus aufgerufen wird, ist this genau der Wert des ersten Arguments des call() von call() oder apply() . (Im normalen Modus werden null und undefined durch das globale Object und Werte, die keine Objekte sind, werden in Objekte umgewandelt.)

  • Im strikten Modus erhalten Sie einen TypeError , wenn Sie versuchen, Readonly-Eigenschaften zuzuweisen oder neue Eigenschaften für ein nicht erweiterbares Objekt zu definieren. (Im Normalmodus schlagen beide einfach ohne Fehlermeldung fehl.)

  • Im strikten Modus können Sie beim Übergeben von Code an eval() keine Variablen oder Funktionen im Gültigkeitsbereich des Aufrufers deklarieren oder definieren (wie im normalen Modus möglich). Stattdessen wird ein neuer Gültigkeitsbereich für eval() und die Variablen und Funktionen befinden sich in diesem Gültigkeitsbereich. Dieser Bereich wird zerstört, nachdem eval() Ausführung abgeschlossen hat.
  • Im strikten Modus enthält das Argumentobjekt einer Funktion eine statische Kopie der Werte, die an diese Funktion übergeben werden. Im normalen Modus verhält sich das arguments-object etwas "magisch": Die Elemente des Arrays und die benannten Funktionsparameter verweisen auf denselben Wert.
  • Im strikten Modus erhalten Sie einen SyntaxError wenn auf den delete ein nicht qualifizierter Bezeichner (ein Variablen-, Funktions- oder Funktionsparameter) folgt. Im normalen Modus würde der delete nichts bewirken und wird als false ausgewertet.
  • Im strikten Modus erhalten Sie einen TypeError wenn Sie versuchen, eine nicht konfigurierbare Eigenschaft zu löschen. (Im normalen Modus schlägt der Versuch einfach fehl und der delete wird als false ausgewertet.)
  • Im strikten Modus wird dies als syntaktischer Fehler betrachtet, wenn Sie versuchen, mehrere Eigenschaften mit demselben Namen für ein Objektliteral zu definieren. (Im normalen Modus gibt es keinen Fehler.)
  • Im strikten Modus wird es als syntaktischer Fehler betrachtet, wenn eine Funktionsdeklaration mehrere Parameter mit demselben Namen hat. (Im normalen Modus gibt es keinen Fehler.)
  • Im strikten Modus sind Oktal-Literale nicht zulässig (dies sind Literale, die mit 0x . (Im normalen Modus lassen manche Implementierungen Oktal-Literale zu.)
  • Im strikten Modus werden die Bezeichner eval und die arguments wie Schlüsselwörter behandelt. Sie können ihren Wert nicht ändern, ihnen keinen Wert zuweisen und sie nicht als Namen für Variablen, Funktionen, Funktionsparameter oder Bezeichner eines catch-Blocks verwenden.
  • Im strikten Modus gibt es weitere Einschränkungen für die Möglichkeiten, den Aufrufstack zu untersuchen. arguments.caller und arguments.callee verursachen einen TypeError in einer Funktion im strikten Modus. Darüber hinaus verursachen einige Aufrufer- und Argumenteigenschaften von Funktionen im strikten Modus einen TypeError wenn Sie versuchen, sie zu lesen.

Wenn Sie einen Browser verwenden, der im letzten Jahr veröffentlicht wurde, wird wahrscheinlich der strikte JavaScript-Modus unterstützt. Nur ältere Browser, bevor ECMAScript 5 zum aktuellen Standard wurde, unterstützen dies nicht.

Die Anführungszeichen um den Befehl stellen sicher, dass der Code auch in älteren Browsern funktioniert (obwohl die Dinge, die einen Syntaxfehler im strikten Modus erzeugen, im Allgemeinen dazu führen, dass das Skript in diesen älteren Browsern auf eine schwer zu erkennende Weise fehlerhaft arbeitet).


Zitieren von w3schools :

Die "strikte Anwendung" -Richtlinie

Die Anweisung "use strict" ist neu in JavaScript 1.8.5 (ECMAScript-Version 5).

Es ist keine Anweisung, sondern ein Ausdruck, der in früheren Versionen von JavaScript ignoriert wurde.

Der Zweck von "use strict" gibt an, dass der Code im "strikten Modus" ausgeführt werden soll.

Im strikten Modus können Sie beispielsweise nicht deklarierte Variablen nicht verwenden.

Warum strikter Modus?

Der strikte Modus erleichtert das Schreiben von "sicherem" JavaScript.

Der strikte Modus ändert die zuvor akzeptierte "schlechte Syntax" in echte Fehler.

Bei normalem JavaScript wird durch die falsche Eingabe eines Variablennamens eine neue globale Variable erstellt. Im strikten Modus wird ein Fehler ausgegeben, wodurch das versehentliche Erstellen einer globalen Variablen unmöglich wird.

In normalem JavaScript erhält ein Entwickler kein Fehlerfeedback, bei dem nicht schreibbaren Eigenschaften Werte zugewiesen werden.

Im strikten Modus führt jede Zuweisung zu einer nicht beschreibbaren Eigenschaft, einer Nur-Getter-Eigenschaft, einer nicht vorhandenen Eigenschaft, einer nicht vorhandenen Variablen oder einem nicht vorhandenen Objekt zu einem Fehler.

Weitere Informationen finden Sie unter http://www.w3schools.com/js/js_strict.asp


"use strict"Der JavaScript-Code wird im strikten Modus ausgeführt , was bedeutet, dass vor der Verwendung alles definiert werden muss. Der Hauptgrund für den strikten Modus besteht darin, versehentliche globale Verwendung undefinierter Methoden zu vermeiden.

Auch im strikten Modus laufen die Dinge schneller, einige Warnungen oder stille Warnungen führen zu schwerwiegenden Fehlern. Es ist besser, sie immer zu verwenden, um einen klareren Code zu erstellen.

"use strict"Wird in ECMA5 häufig verwendet, in ECMA6 ist es standardmäßig in JavaScript enthalten. Es muss also nicht hinzugefügt werden, wenn Sie ES6 verwenden.

Schauen Sie sich diese Aussagen und Beispiele von MDN an:

Die "use strict" Direktive
Die "use strict" Direktive ist neu in JavaScript 1.8.5 (ECMAScript Version 5). Es ist keine Anweisung, sondern ein Ausdruck, der in früheren Versionen von JavaScript ignoriert wurde. Der Zweck von "use strict" gibt an, dass der Code im "strikten Modus" ausgeführt werden soll. Im strikten Modus können Sie beispielsweise nicht deklarierte Variablen nicht verwenden.

Beispiele für die Verwendung von "use strict":
Strikter Modus für Funktionen: Um den strikten Modus für eine Funktion aufzurufen, setzen Sie die genaue Anweisung "use strict". (oder 'use strict';) im Körper der Funktion vor allen anderen Anweisungen.

1) strikter Modus in Funktionen

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) strikter Modus im ganzen Skript

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) Zuordnung zu einem nicht beschreibbaren Global

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

Sie können mehr über MDN lesen .


Meine zwei Cent:

Der strikte Modus hat zum Ziel, Probleme schneller zu debuggen. Es hilft den Entwicklern, indem es eine Ausnahme auslöst, wenn bestimmte falsche Dinge auftreten, die ein stilles und seltsames Verhalten Ihrer Webseite verursachen können. In dem Moment, in dem wir use strict , wirft der Code Fehler aus, die dem Entwickler helfen, ihn im Voraus zu beheben.

Wenige wichtige Dinge, die ich nach dem use strict gelernt habe:

Verhindert die Deklaration von globalen Variablen:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

Mit diesem Code wird nun nameoftree im globalen Gültigkeitsbereich erstellt, auf den über nameoftree zugegriffen werden window.nameoftree . Wenn wir use strict implementieren use strict würde der Code einen Fehler auslösen.

Nicht abgerufener ReferenceError: nameoftree ist nicht definiert

Sample

Beseitigt with Aussage:

with Anweisungen lassen sich mit Tools wie uglify-js nicht uglify-js . Sie sind auch deprecated und werden von zukünftigen JavaScript-Versionen entfernt.

Sample

Verhindert Duplikate:

Wenn wir eine doppelte Eigenschaft haben, wird eine Ausnahme ausgelöst

Nicht erfasstes SyntaxError: Doppelte Dateneigenschaft im Objektliteral im strikten Modus nicht zulässig

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

Es gibt wenige mehr, aber ich muss mehr darüber erfahren.


Der "strikte" Modus von JavaScript wird in ECMAScript 5 eingeführt.

  (function() {
  "use strict";
   your code...
   })();

schreibe "use strict"; Ganz oben in Ihrer JS-Datei wird die strikte Syntaxprüfung aktiviert. Es erledigt folgende Aufgaben für uns:

(i) zeigt einen Fehler an, wenn Sie versuchen, eine nicht deklarierte Variable zuzuweisen

(ii) verhindert, dass Sie wichtige JS-Systembibliotheken überschreiben

(ii) verbietet einige unsichere oder fehleranfällige Sprachfunktionen

"use strict" funktioniert auch innerhalb einzelner Funktionen. Es ist immer eine bessere Vorgehensweise, "use strict" in Ihren Code aufzunehmen.

Browser-Kompatibilitätsproblem: Die "use" -Anweisungen sollen abwärtskompatibel sein. Browser, die sie nicht unterstützen, sehen nur ein String-Literal, auf das nicht weiter verwiesen wird. Also werden sie darüber hinweggehen und weitergehen.


Kleines Beispiel zum Vergleich:

Nicht strenger Modus:

for (i of [1,2,3]) console.log(i)

// output:
// 1
// 2
// 3

Strikter Modus:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

Strict wird verwendet, um häufige und wiederholte Fehler anzuzeigen, so dass sie anders gehandhabt werden und die Ausführung von Java-Skripts ändert. Solche Änderungen sind:

  • Verhindert versehentliche Globals

  • Keine Duplikate

  • Beseitigt mit

  • Beseitigt diesen Zwang

  • Sicherere Bewertung ()

  • Fehler bei unveränderlichen Objekten

Sie können diesen article für die Details lesen


"streng verwenden"; ist das Bemühen der ECMA, JavaScript etwas robuster zu machen. Es bringt in JS den Versuch, es zumindest etwas "streng" zu machen (andere Sprachen implementieren strikte Regeln seit den 90er Jahren). Es "zwingt" JavaScript-Entwickler, bestimmte Best Practices für das Codieren einzuhalten. Dennoch ist JavaScript sehr zerbrechlich. Es gibt keine typisierten Variablen, typisierten Methoden usw. Ich empfehle JavaScript-Entwicklern dringend, eine robustere Sprache wie Java oder ActionScript3 zu lernen und dieselben bewährten Methoden in Ihrem JavaScript-Code zu implementieren. Dies wird besser funktionieren und einfacher sein debuggen.


Beachten Sie, dass use strictin EcmaScript 5 eingeführt wurde und seitdem beibehalten wurde.

Im Folgenden sind die Bedingungen zum Auslösen des strikten Modus in ES6 und ES7 :

  • Globaler Code ist ein strikter Moduscode, wenn er mit einem Direktive Prolog beginnt, der eine Use Strict-Direktive enthält (siehe 14.1.1).
  • Der Modulcode ist immer ein strikter Moduscode.
  • Alle Teile einer ClassDeclaration oder einer ClassExpression sind strikte Moduscodes .
  • Eval-Code ist ein strikter Moduscode, wenn er mit einem Direktive-Prolog beginnt, der eine Use-Strict-Direktive enthält, oder wenn der Aufruf zum eval ein direktes Eval (siehe 12.3.4.1) ist, der im strengen Moduscode enthalten ist.
  • Der Funktionscode ist ein strikter Moduscode, wenn die zugehörige FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition oder ArrowFunction im strikten Moduscode enthalten ist oder wenn der Code, der den Wert des internen [[ECMAScriptCode] - Steckplatzes der Funktion erzeugt, mit einem Direktive Prologue beginnt das enthält eine Use-Strict-Direktive.
  • Funktionscode, der den integrierten Funktions- und Generatorkonstruktoren als Argumente bereitgestellt wird, ist strikter Moduscode, wenn das letzte Argument ein String ist, der bei der Verarbeitung ein FunctionBody ist , der mit einem Direktive Prologue beginnt, der eine Use Strict-Direktive enthält.

Das Einfügen use strictam Anfang aller sensiblen JavaScript-Dateien von diesem Punkt aus ist ein kleiner Weg, um ein besserer JavaScript-Programmierer zu sein und zu vermeiden, dass Zufallsvariablen global werden und sich die Dinge unbemerkt ändern.


Die Hauptgründe, warum Entwickler verwenden sollten, "use strict"sind:

  1. Verhindert versehentliches Deklarieren globaler Variablen. Durch die Verwendung "use strict()"wird sichergestellt, dass Variablen varvor der Verwendung deklariert werden. Z.B:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
    
  2. Hinweis: Die "use strict"Direktive wird nur am Anfang eines Skripts oder einer Funktion erkannt.
  3. Die Zeichenfolge "arguments"kann nicht als Variable verwendet werden:

    "use strict";
    var arguments = 3.14;    // This will cause an error
    
  4. Schränkt die Verwendung von Schlüsselwörtern als Variablen ein. Wenn Sie versuchen, sie zu verwenden, werden Fehler ausgegeben.

Kurz gesagt, wird Ihr Code weniger fehleranfällig und Sie werden wiederum dazu gebracht, guten Code zu schreiben.

Mehr darüber erfahren Sie hier .


Normalerweise folgt das Java-Skript keinen strengen Regeln, was die Fehlerwahrscheinlichkeit erhöht. Nach der Verwendung "use strict"sollte der Java-Skriptcode strengen Regeln entsprechen wie in anderen Programmiersprachen, z. B. Verwendung von Terminatoren, Deklaration vor der Initialisierung usw.

Wenn "use strict"verwendet wird, sollte der Code nach strengen Regeln geschrieben werden, wodurch die Wahrscheinlichkeit von Fehlern und Mehrdeutigkeiten verringert wird.





use-strict