Pas recommandé d'utiliser "use strict" dans ES6?

200

Je ne connais pas encore ECMAScript 6. Je viens de cloner le référentiel React Starter Kit, qui utilise ES6 pour le code d'application. J'ai été surpris de voir que le linter est configuré pour interdire les occurrences de la use strictdirective, que je pensais être recommandée dans le JavaScript pré-ES6. Alors à quoi ça sert?

Midiparse
la source

Réponses:

257

Les modules ES6 sont toujours en mode strict. Pour citer la partie pertinente de la spécification :

10.2.1 Code de mode strict

Une unité syntaxique de script ECMAScript peut être traitée à l'aide de la syntaxe et de la sémantique en mode illimité ou strict. Le code est interprété comme un code en mode strict dans les situations suivantes:

  • Le code global est un code de mode strict s'il commence par un prologue de directive qui contient une directive d'utilisation stricte (voir 14.1.1).
  • Le code du module est toujours un code de mode strict.
  • Toutes les parties d'une ClassDeclaration ou d'une ClassExpression sont un code de mode strict.
  • Le code Eval est un code en mode strict s'il commence par un prologue de directive qui contient une directive Use Strict ou si l'appel à eval est un eval direct (voir 12.3.4.1) contenu dans un code en mode strict.
  • Le code de fonction est un code de mode strict si la fonction FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition ou ArrowFunction est contenue dans le code de mode strict ou si le code qui produit la valeur de l'emplacement interne [[ECMAScriptCode]] de la fonction commence par un prologue de directive qui contient une directive d'utilisation stricte.
  • Le code de fonction fourni comme arguments aux constructeurs de fonction et de générateur intégrés est un code de mode strict si le dernier argument est une chaîne qui, lorsqu'elle est traitée, est un FunctionBody qui commence par un prologue de directive contenant une directive d'utilisation stricte.
Kit Sunde
la source
11
Quelle est la différence entre le code global et le code de module? Je pense que je me méprends, car pour moi le code du module signifie tout dans module.js si j'ai besoin ('module').
May Oakes
8
@BrynnMahsman ES2015 a des modules natifs. CommonJS est juste une bibliothèque et n'a rien à voir avec la langue.
Kit Sunde
18
Merci pour votre réponse. Ce n'est donc pas un module ES6 s'il n'utilise pas les mots-clés d'import / export? En ce moment, j'utilise Node 4 et je n'ai pas accès aux mots clés d'importation / exportation et j'utilise simplement le module CommonJS module.exports et require () avec les fonctionnalités ES6 activées par défaut. Cela expliquerait pourquoi je dois mettre use strict en haut de chaque fichier. Donc, techniquement, j'écris toujours des modules CommonJS avec certaines fonctionnalités ES6 activées dans V8?
May Oakes du
7
Pour un examen détaillé de "est-ce un module?" , voir nczonline.net/blog/2016/04/… "... alors que la présence d'importation ou d'exportation peut indiquer un module, l'absence d'importation ou d'exportation n'indique pas clairement que le fichier n'est pas un module. Il y a donc aucun moyen efficace de détecter automatiquement qu'un fichier est un module pendant l'analyse. "
ptim
1
Qu'est-ce qu'un "module" exactement? J'obtiens l' stricterreur (avec le préréglage AirBnB ) sur un script qui se compose uniquement de "use strict"; console.log('foo'). Est-ce un module?
Dan Dascalescu