Nicht empfohlen, in ES6 "use strict" zu verwenden?

199

Ich bin noch nicht mit ECMAScript 6 vertraut. Ich habe gerade das Repo des React Starter Kit geklont, das ES6 als Anwendungscode verwendet. Ich war überrascht zu sehen, dass der Linter so konfiguriert ist , dass er das Auftreten der use strictDirektive verbietet , was meiner Meinung nach in JavaScript vor ES6 empfohlen wurde. Also, was ist der Punkt?

Midiparse
quelle

Antworten:

256

ES6-Module befinden sich immer im strengen Modus. Um den relevanten Teil der Spezifikation zu zitieren :

10.2.1 Strict Mode Code

Eine syntaktische Einheit für ECMAScript-Skripte kann entweder mit uneingeschränkter oder strikter Modus-Syntax und -Semantik verarbeitet werden. Code wird in den folgenden Situationen als strenger Moduscode interpretiert:

  • Globaler Code ist ein Code im strengen Modus, wenn er mit einem Direktiven-Prolog beginnt, der eine Richtlinie zum strikten Gebrauch 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 Code für den strengen Modus, wenn er mit einem Direktiven-Prolog beginnt, der eine Richtlinie zur strikten Verwendung enthält, oder wenn der Aufruf von eval eine direkte Bewertung (siehe 12.3.4.1) ist, die im Code für den strengen Modus enthalten ist.
  • Funktionscode ist strikter Moduscode, wenn die zugehörige FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition oder ArrowFunction im strengen Moduscode enthalten ist oder wenn der Code, der den Wert des internen Slots der Funktion [[ECMAScriptCode]] erzeugt, mit einem Direktivenprolog beginnt das enthält eine Use Strict Directive.
  • Der Funktionscode, der als Argumente für die integrierten Funktions- und Generatorkonstruktoren bereitgestellt wird, ist ein Code für den strengen Modus, wenn das letzte Argument ein String ist, der bei der Verarbeitung ein FunctionBody ist, der mit einem Direktivenprolog beginnt, der eine Use Strict-Direktive enthält.
Kit Sunde
quelle
11
Was ist der Unterschied zwischen globalem Code und Modulcode? Ich glaube, ich verstehe das falsch, da Modulcode für mich alles in module.js bedeutet, wenn ich es benötige ('module').
Mai Oakes
8
@BrynnMahsman ES2015 verfügt über native Module. CommonJS ist nur eine Bibliothek und hat nichts mit der Sprache zu tun.
Kit Sunde
18
Vielen Dank für Ihre Antwort. Ist es also kein ES6-Modul, wenn es nicht die Schlüsselwörter import / export verwendet? Im Moment verwende ich Knoten 4 und habe keinen Zugriff auf Import- / Export-Schlüsselwörter. Ich verwende nur das CommonJS-Modul.exports und require () zusammen mit den standardmäßig aktivierten ES6-Funktionen. Es würde erklären, warum ich strikt oben in jede Datei setzen muss. Technisch gesehen schreibe ich also immer noch CommonJS-Module mit einigen in V8 aktivierten ES6-Funktionen?
Mai Oakes
7
Für eine detaillierte Prüfung von "Ist es ein Modul?" , siehe nczonline.net/blog/2016/04/… "... während das Vorhandensein von Import oder Export möglicherweise auf ein Modul hinweist, zeigt das Fehlen von Import oder Export nicht eindeutig an, dass die Datei kein Modul ist Keine effektive Möglichkeit, beim Parsen automatisch zu erkennen, dass eine Datei ein Modul ist. "
ptim
1
Was genau ist ein "Modul"? Ich erhalte den strictFehler (mit der AirBnB-Voreinstellung ) für ein Skript, das nur aus besteht "use strict"; console.log('foo'). Ist das ein Modul?
Dan Dascalescu