webentwicklung-frage-antwort-db.com.de

Was ist "strenger Modus" und wie wird er verwendet?

Ich habe mir die JavaScript-Referenz im Mozilla Developer Network angesehen und etwas namens "strict mode". Ich habe es durchgelesen und habe Probleme zu verstehen, was es tut. Kann jemand kurz (allgemein) erklären, wozu es dient und wie es nützlich ist?

130
nkcmr

Sein Hauptzweck ist es, mehr zu überprüfen.

Fügen Sie einfach "use strict"; Oben in Ihren Code ein, bevor Sie etwas anderes tun.

Zum Beispiel ist blah = 33; Gültiges JavaScript. Dies bedeutet, dass Sie eine vollständig globale Variable blah erstellen.

Aber im strikten Modus ist es ein Fehler, weil Sie nicht das Schlüsselwort "var" verwendet haben, um die Variable zu deklarieren.

Die meiste Zeit möchten Sie keine globalen Variablen in einem beliebigen Bereich erstellen. In den meisten Fällen ist blah = 33 ist geschrieben, es ist ein Fehler und der Programmierer wollte nicht, dass es eine globale Variable ist, sie wollten var blah = 33 schreiben.

In ähnlicher Weise werden viele Dinge, die technisch gültig sind, nicht zugelassen. NaN = "lol" Erzeugt keinen Fehler. Es ändert auch nicht den Wert von NaN. Die Verwendung von strict this (und ähnlichen seltsamen Anweisungen) führt zu Fehlern. Die meisten Leute wissen dies zu schätzen, da es keinen Grund gibt, jemals NaN = "lol" Zu schreiben. Es gab also höchstwahrscheinlich einen Tippfehler.

Lesen Sie mehr auf der MDN-Seite zum strikten Modus

147
Simon Sarris

Ein Aspekt des strikten Modus, der in Simons Antwort nicht bereits erwähnt wurde, ist, dass der strikte Modus this in Funktionen, die durch Funktionsaufrufe aufgerufen werden, auf undefined setzt.

Also solche Sachen

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

wird einen Fehler verursachen, wenn privateMethod aufgerufen wird (da Sie undefined keine Eigenschaft hinzufügen können), anstatt dem globalen Objekt sinnlos eine b -Eigenschaft hinzuzufügen.

33
Adam Rackis

Der Strict-Modus wurde hinzugefügt, damit es eine leicht statisch analysierbare Teilmenge von EcmaScript gibt, die ein gutes Ziel für zukünftige Versionen der Sprache wäre. Der strenge Modus wurde auch in der Hoffnung entwickelt, dass Entwickler, die sich auf den strengen Modus beschränken, weniger Fehler machen und die Fehler, die sie machen, offensichtlicher werden.

Harmony , die hoffentlich die nächste Hauptversion von EcmaScript wird, wird auf ES5 strict aufbauen.

Harmony baut auf dem strengen ES5-Modus auf, um zu viele Modi zu vermeiden.

Einige andere Sprachexperimente hängen auch vom strengen Modus ab. SES hängt von der Analysierbarkeit des strengen ES5-Modus ab.

Design-Experiment für SES (Secure ECMAScript)

Entwerfen Sie eine Object Capability Programming Language, indem Sie Funktionen in ES5/Strict entfernen oder reparieren.

Es sollte eine einfache Übersetzung von SES nach ES5/Strict geben.

Anhang C der Norm erläutert die Unterschiede zwischen dem strengen Modus und dem normalen Modus.

Die strengen Modusbeschränkungen und Ausnahmen

  • Die Bezeichner "implements", "interface", "let", "package", "private", "protected", "public", "static" und "yield" werden innerhalb des strengen Moduscodes als FutureReservedWord-Token klassifiziert. (7.6.12 [?]).
  • Eine konforme Implementierung kann bei der Verarbeitung von Code im strengen Modus die Syntax von NumericLiteral (7.8.3) möglicherweise nicht auf OctalIntegerLiteral erweitern, wie in B.1.1 beschrieben.
  • Eine konforme Implementierung kann bei der Verarbeitung von striktem Moduscode (siehe 10.1.1) die Syntax von EscapeSequence möglicherweise nicht auf OctalEscapeSequence erweitern, wie in B.1.2 beschrieben.
  • Die Zuweisung zu einer nicht deklarierten Kennung oder einer anderweitig nicht auflösbaren Referenz erstellt keine Eigenschaft im globalen Objekt. Wenn eine einfache Zuweisung innerhalb eines strengen Moduscodes erfolgt, darf LeftHandSide nicht als unlösbare Referenz ausgewertet werden. In diesem Fall wird eine ReferenceError-Ausnahme ausgelöst (8.7.2). Die LeftHandSide darf auch kein Verweis auf eine Dateneigenschaft mit dem Attributwert {[[Writable]]: false}, auf eine Accessor-Eigenschaft mit dem Attributwert {[[Set]]: undefined} oder auf eine nicht vorhandene sein Eigenschaft eines Objekts, dessen interne Eigenschaft den Wert false hat. In diesen Fällen wird eine TypeError-Ausnahme ausgelöst (11.13.1).
  • Die Bezeichnerauswertung oder die Argumente werden möglicherweise nicht als LeftHandSideExpression eines Zuweisungsoperators (11.13) oder eines PostfixExpression-Operators (11.3) oder als UnaryExpression-Operator angezeigt, der von einem Präfixinkrementierungsoperator (11.4.4) oder einem Präfixdekrementierungsoperator (11.4.5) bearbeitet wird . Argumentobjekte für Funktionen im strikten Modus definieren nicht konfigurierbare Accessor-Eigenschaften mit den Namen "caller" und "callee", die beim Zugriff eine TypeError-Ausnahme auslösen (10.6).
  • Argumentobjekte für Funktionen im strikten Modus teilen ihre Array-indizierten Eigenschaftswerte nicht dynamisch mit den entsprechenden formalen Parameterbindungen ihrer Funktionen. (10,6). Wenn für Funktionen im strengen Modus ein Argumentobjekt erstellt wird, ist die Bindung der lokalen Bezeichnerargumente an das Argumentobjekt unveränderlich und daher möglicherweise nicht das Ziel eines Zuweisungsausdrucks. (10,5).
  • Es ist ein SyntaxError, wenn der Code für den strengen Modus ein ObjectLiteral mit mehr als einer Definition einer Dateneigenschaft enthält (11.1.5). Es ist ein SyntaxError, wenn der Bezeichner "eval" oder der Bezeichner "arguments" als Bezeichner in einer PropertySetParameterList einer PropertyAssignment auftritt, die in striktem Code enthalten ist, oder wenn der Funktionskörper strikter Code ist (11.1.5).
  • Der Bewertungscode im strikten Modus kann keine Variablen oder Funktionen in der Variablenumgebung des aufzurufenden Aufrufers instanziieren. Stattdessen wird eine neue variable Umgebung erstellt und diese Umgebung zur Deklarationsbindungsinstanziierung für den Eval-Code (10.4.2) verwendet.
  • Wenn dies im strengen Moduscode ausgewertet wird, wird dieser Wert nicht für ein Objekt erzwungen. Ein this-Wert von null oder undefined wird nicht in das globale Objekt konvertiert, und primitive Werte werden nicht in Wrapper-Objekte konvertiert. Der über einen Funktionsaufruf übergebene Wert (einschließlich der Aufrufe mit Function.prototype.apply und Function.prototype.call) erzwingt nicht die Übergabe dieses Werts an ein Objekt (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
  • Wenn ein Löschoperator innerhalb eines strengen Moduscodes auftritt, wird ein SyntaxError ausgelöst, wenn sein UnaryExpression eine direkte Referenz auf eine Variable, ein Funktionsargument oder einen Funktionsnamen ist (11.4.1).
  • Wenn ein Löschoperator innerhalb eines strengen Moduscodes auftritt, wird ein TypeError ausgelöst, wenn die zu löschende Eigenschaft das Attribut {[[Konfigurierbar]]: false} (11.4.1) aufweist. Es ist ein SyntaxError, wenn eine VariableDeclaration oder VariableDeclarationNoIn innerhalb eines strengen Codes vorkommt und deren Bezeichner eval oder Argumente (12.2.1) sind.
  • Der Code für den strengen Modus enthält möglicherweise kein WithStatement. Das Auftreten eines WithStatements in einem solchen Kontext ist ein SyntaxError (12.10).
  • Es ist ein SyntaxError, wenn ein TryStatement mit einem Catch innerhalb eines strengen Codes auftritt und der Identifier der Catch-Produktion eval oder arguments ist (12.14.1).
  • Es ist ein SyntaxError, wenn der Bezeichner eval oder die Argumente in einer FormalParameterList eines Strict Mode FunctionDeclaration oder FunctionExpression (13.1) vorkommen.
  • Eine Strict-Mode-Funktion darf nicht zwei oder mehr formale Parameter mit demselben Namen enthalten. Ein Versuch, eine solche Funktion mit einem FunctionDeclaration-, FunctionExpression- oder Function-Konstruktor zu erstellen, ist ein SyntaxError (13.1, 15.3.2).
  • Eine Implementierung darf nicht über die in dieser Spezifikation definierten Bedeutungen innerhalb von Strict-Mode-Funktionen von Eigenschaften mit dem Namen caller oder Argumenten von Funktionsinstanzen hinausgehen. ECMAScript-Code darf keine Eigenschaften mit diesen Namen für Funktionsobjekte erstellen oder ändern, die Funktionen im strengen Modus entsprechen (10.6, 13.2, 15.3.4.5.3).
  • Es ist ein SyntaxError, die Bezeichner eval oder arguments als Bezeichner einer Funktionsdeklaration oder eines Funktionsausdrucks oder als formalen Parameternamen (13.1) innerhalb des strengen Moduscodes zu verwenden. Wenn Sie versuchen, eine solche Funktion im strengen Modus mithilfe des Function-Konstruktors (15.3.2) dynamisch zu definieren, wird eine SyntaxError-Ausnahme ausgelöst.
21
Mike Samuel

ECMAScript 5 führte das Konzept von strict mode ein.

Aufruf des Strict Mode im Code

Der strikte Modus gilt für ganze Skripte oder für einzelne Funktionen. Es gilt nicht für Blockanweisungen in geschweiften Klammern, und der Versuch, sie auf solche Kontexte anzuwenden, führt zu nichts.

Gesamtes Skript:

Nehmen wir an, wir erstellen app.js, sodass das Hinzufügen des Skripts zur Verwendung der ersten Anweisung den strengen Modus für den gesamten Code erzwingt.

// app.js whole script in strict mode syntax
“use strict”;
// Now you can start writing your code 

Strenger Modus für die Funktion:

Um den strikten Modus für eine Funktion aufzurufen, geben Sie die genaue Anweisung "use strict" ein. am Anfang des Funktionskörpers vor jeder anderen Anweisung.

function yourFunc(){
 "use strict";

 // Your function code logic
}

Im strengen Modus wurden einige Änderungen an der normalen Javascript-Semantik vorgenommen. Der erste strenge Modus beseitigt einige stille JavaScript-Fehler, indem sie in Fehler umgewandelt werden.

Zum Beispiel: Code im strengen Modus

enter image description here

Im obigen Codebeispiel ohne Verwendung des strengen Modus im Code wird kein Fehler ausgegeben. Während wir auf die Variable x zugreifen, ohne sie zu deklarieren. Wenn Sie also im strikten Modus auf eine nicht deklarierte Variable zugreifen, wird ein Fehler ausgegeben.

Versuchen wir nun, auf die Variable x zuzugreifen, ohne sie ohne strengen Modus zu deklarieren.

(function(){
    x = 3;
})();

// Will not throw an error

Vorteil der Verwendung des Strict-Modus:

  • Beseitigen Sie stille JavaScript-Fehler, indem Sie einen Fehler auslösen.
  • Behebt Fehler, die es der JavaScript-Engine erschweren, eine Optimierung durchzuführen.
  • Stellen Sie sicher, dass Code manchmal schneller ausgeführt wird als identischer Code, der sich nicht im strikten Modus befindet
  • Verbietet eine Syntax, die wahrscheinlich in zukünftigen Versionen von ECMAScript definiert wird.
6
Nishant Kumar

Im strengen Modus werden einige Änderungen an der normalen JavaScript-Semantik vorgenommen.

  • der strikte Modus beseitigt einige stille JavaScript-Fehler, indem er sie so ändert, dass sie Fehler auslösen.

  • der strenge Modus behebt Fehler, die es JavaScript-Engines erschweren, Optimierungen vorzunehmen.

  • der strikte Modus verbietet eine Syntax, die wahrscheinlich in zukünftigen Versionen von ECMAScript definiert wird.

5
Renganathan M G

2017 und ich habe endlich die Dokumentation gefunden:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

Im strengen Modus können Sie eine eingeschränkte Variante von JavaScript aktivieren. Der strikte Modus ist nicht nur eine Teilmenge: Er hat absichtlich eine andere Semantik als normaler Code. Browser, die den strikten Modus nicht unterstützen, führen einen Code für den strikten Modus mit einem anderen Verhalten als Browser aus. Verlassen Sie sich daher nicht auf den strikten Modus, ohne die Funktionen auf die relevanten Aspekte des strikten Modus zu testen. Strenger Modus-Code und nicht-strenger Modus-Code können gleichzeitig vorhanden sein, sodass Skripte inkrementell in den strengen Modus wechseln können.


Im strengen Modus werden einige Änderungen an der normalen JavaScript-Semantik vorgenommen. Erstens beseitigt der strikte Modus einige stille JavaScript-Fehler, indem er sie so ändert, dass sie Fehler auslösen. Zweitens behebt der strikte Modus Fehler, die es JavaScript-Engines erschweren, Optimierungen vorzunehmen: Code für den strengen Modus kann manchmal schneller ausgeführt werden als identischer Code, der nicht im strengen Modus ausgeführt wird. Drittens verbietet der strikte Modus eine Syntax, die wahrscheinlich in zukünftigen Versionen von ECMAScript definiert wird.

1
Tilak Maddy

ECMAScript5 führt einige neue Objekte und Eigenschaften sowie das sogenannte "strict mode".

Der strikte Modus ist eine Teilmenge der Sprache, die veraltete Funktionen ausschließt. Der strikte Modus ist aktiviert und nicht erforderlich. Wenn Sie also möchten, dass Ihr Code im strengen Modus ausgeführt wird, erklären Sie Ihre Absicht, indem Sie (einmal pro Funktion oder einmal für das gesamte Programm) die folgende Zeichenfolge verwenden:

"use strict";
1
Vahid Hallaji

Frage:
Folgendes ist das Problem, auf das ich gestoßen bin: Ich verfolgte ein Tutorial und es endete mit dem Versuch, die folgende scss -Datei zu kompilieren und daraus CSS-Code zu generieren.

.fatty{
  width: percentage(6/7);
}

mit folgender gulpfile.js Aufgabe:

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    return gulp.src('app/scss/styles.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
});

Der Fehler, den ich erhalte, lautet also wie folgt:

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66
    let sassMap;
    ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
// stacktrace here...

Lösung:
Es zeigt mir also die Datei index.js, Die sich in meinem gulp-sass-Modul befindet (das grundsätzlich gesperrt ist und nicht bearbeitet werden sollte). Aber wenn ich mit Nachdruck vorgehen und den "use_strict" Oben in die index.js - Datei einfügen, läuft meine Aufgabe reibungslos ab.

Ich war hilflos und benutze dies weiterhin als Lösung! Aber dann, nachdem ich einige andere SO Fragen und Antworten, die ich als Antwort gesehen habe durchgesehen habe, wie folgt:

Sudo npm install -g n
Sudo n stable

und früher habe ich meine NodeJs (auf Version 10.x) aktualisiert und dann Gulp neu erstellt, indem ich die folgenden Befehle ausgeführt habe, wie vom Terminal angewiesen:

npm rebuild node-sass --force

Und es ist alles in Ordnung. So wurde es gelöst. Ich habe die Änderungen rückgängig gemacht, die ich für die index.js - Gulp-Moduldatei vorgenommen habe. Und jetzt läuft es reibungslos.

Ich hoffe, diese Antwort ist für jemanden da draußen hilfreich!

0
Randika Vishman