142 votes

qu'est-ce que "mode strict" et comment est-il utilisé?

J'ai été à la recherche de plus de JavaScript de référence de plus à Mozilla Developer Network, et je suis tombé sur quelque chose qui s'appelle "strict mode". Je l'ai lu et que je vais avoir de la difficulté à comprendre ce qu'il fait. Quelqu'un peut-il expliquer brièvement (en général) ce qu'il est et comment il est utile?

156voto

Simon Sarris Points 33799

Il y a une centaine d'articles sur ce: http://hacks.mozilla.org/2011/01/ecmascript-5-strict-mode-in-firefox-4/

Juste ajouter "use strict"; en haut de votre code, avant toute autre chose.

Son but principal est de faire plus de contrôles.

Par exemple, blah = 33; est valable JavaScript. Cela signifie que vous créer un complètement variable globale blah.

Mais en mode strict, c'est une erreur, parce que vous n'avez pas utilisé le mot-clé "var" pour déclarer la variable.

La plupart du temps vous ne veux pas créer des variables globales dans le milieu de l'arbitraire de la portée, de sorte que la plupart du temps qu' blah = 33 est écrit que c'est une erreur et que le programmeur n'a pas vraiment envie d'être une variable globale, ils ont voulu écrire var blah = 33.

De même, il interdit beaucoup de choses qui sont techniquement valable de le faire. NaN = "lol" ne produit pas une erreur. Il également ne pas modifier la valeur de NaN. à l'aide de stricte (et similaires bizarre états) de produire des erreurs. La plupart des gens apprécient car il n'y a aucune raison de jamais écrire NaN = "lol", donc il y a probablement une faute de frappe.

35voto

Adam Rackis Points 45559

Un aspect de la mode strict est pas déjà mentionné dans Simon réponse est que le mode strict ensembles this de undefined dans les fonctions appelées par le biais de l'invocation de la fonction.

Donc, ce genre de choses

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

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

va provoquer une erreur lors de l' privateMethod est appelé (puisque vous ne pouvez pas ajouter une propriété à l' undefined), plutôt que de ne pas l'ajout d'un b de la propriété de l'objet global.

23voto

Mike Samuel Points 54712

Le mode Strict a été ajouté, de sorte qu'il soit facilement de manière statique, analysable sous-ensemble de EcmaScript qui serait une bonne cible pour les futures versions de la langue. Le mode Strict a également été conçu dans l'espoir que les développeurs se limite à la stricte mode de faire moins d'erreurs, et que les bugs qu'ils font se manifeste dans plus de manière évidente.

L'harmonie, qui nous l'espérons, deviendront la prochaine version majeure de EcmaScript est destiné à être intégré sur le dessus de l'ES5 stricte.

L'harmonie s'appuie sur ES5 mode strict pour éviter un trop grand nombre de modes.

Une autre langue des expériences dépendent également du mode strict. SES dépend ES5 mode strict du analyzability.

SES (Secure ECMAScript) la Conception de l'Expérience

La conception d'un Objet de la Capacité de Langage de Programmation, par la suppression ou la réparation de fonctionnalités dans l'ES5/Stricte.

Il devrait être une simple traduction de SES pour ES5/Stricte.

L'annexe C de la norme explique les différences entre le mode strict et le mode normal.

Le mode strict de restrictions et exceptions

  • Les identifiants "met en œuvre", "interface", "laisser", "ensemble", "privé", "protégé", "public", "statique", et le "rendement" sont classés comme FutureReservedWord jetons dans le strict code de mode. (7.6.12 [?]).
  • Une mise en œuvre conforme, lors du traitement en mode strict code, ne peut pas étendre la syntaxe de NumericLiteral (7.8.3) pour inclure OctalIntegerLiteral comme décrit en B. 1.1.
  • Une mise en œuvre conforme, lors du traitement en mode strict code (voir 10.1.1), ne peut pas étendre la syntaxe de EscapeSequence inclure OctalEscapeSequence comme décrit en B. 1.2.
  • L'affectation à un identificateur non déclaré ou autrement insolubles de référence ne crée pas une propriété de l'objet global. Quand une simple cession a lieu dans la plus stricte en mode code, sa main gauche ne doit pas correspondre à une insolubles de Référence. Si il fait un ReferenceError exception est levée (8.7.2). La main gauche ne peut également pas être une référence à une propriété de données avec la valeur de l'attribut {[[Écriture]]:false}, à un accesseur de la propriété avec la valeur de l'attribut {[[Set]]:undefined}, ni à un non-existant de la propriété d'un objet dont le [[Extensible]] intérieur de la propriété a la valeur false. Dans ces cas, une exception TypeError est jeté (11.13.1).
  • L'identificateur eval ou arguments peuvent ne pas apparaître comme le LeftHandSideExpression d'un opérateur d'Affectation (11.13) ou d'un PostfixExpression (11.3) ou de la UnaryExpression opéré par un Préfixe d'Incrémentation (11.4.4) ou un Préfixe de Décrémentation (11.4.5) de l'opérateur. Les Arguments des objets pour le mode strict fonctions définir non configurable par l'accesseur propriétés nommées "appelant" et "destinataire" qui jettent une exception TypeError sur l'accès (10.6).
  • Les Arguments des objets pour le mode strict fonctions ne sont pas dynamiquement partager leur tableau indexé valeurs de propriété avec le paramètre formel correspondant fixations de leurs fonctions. (10.6). Pour le mode strict fonctions, si un des arguments de l'objet est créée la liaison de l'identifiant local des arguments au arguments objet est immuable et ne peut donc pas être la cible d'une expression d'affectation. (10.5).
  • C'est un SyntaxError si le mode strict code contient une ObjectLiteral avec plus d'une définition de toutes les données de propriété (11.1.5). C'est un SyntaxError si l'Identificateur "eval" ou l'Identifiant "arguments" se produit dans l'Identificateur dans un PropertySetParameterList d'un PropertyAssignment qui est contenue dans le strict code ou si son FunctionBody est un code strict (11.1.5).
  • Le mode Strict eval code ne peut pas instancier des variables ou des fonctions dans la variable d'environnement de l'appel à eval. Au lieu de cela, une nouvelle variable d'environnement est créé et que l'environnement est utilisé pour la déclaration de liaison de l'instanciation de la fonction eval (code 10.4.2).
  • Si c'est évaluée dans le mode strict code, puis le cette valeur n'est pas contraint à un objet. Cette valeur null ou undefined n'est pas converti à l'objet global et des valeurs primitives ne sont pas convertis à wrapper objets. Cette valeur transmise par l'intermédiaire d'un appel de fonction (y compris les appels effectués à l'aide de la Fonction.le prototype.appliquer et de la Fonction.le prototype.d'appel) ne pas forcer le passé de cette valeur à un objet (10.4.3, 11.1.1, 15.3.4.3, 15.3.4.4).
  • Lorsqu'un opérateur d'effacement se produit dans le mode strict code, un SyntaxError est levée si son UnaryExpression est une référence directe à une variable, une fonction, l'argument, ou le nom de la fonction(11.4.1).
  • Lorsqu'un opérateur d'effacement se produit dans le mode strict code, une erreur TypeError est levée si la propriété d'être supprimé a l'attribut { [[Configurable]]:false } (11.4.1). C'est un SyntaxError si un VariableDeclaration ou VariableDeclarationNoIn se produit dans le strict code et son Identificateur est eval ou des arguments (12.2.1).
  • Le mode Strict code peut ne pas inclure un WithStatement. La survenance d'un WithStatement dans un tel contexte est un SyntaxError (12.10).
  • C'est un SyntaxError si un TryStatement avec une Capture réalisée dans le strict code et l'Identifiant de l'Attraper production est eval ou des arguments (12.14.1)
  • C'est un SyntaxError si l'identificateur eval ou des arguments apparaît à l'intérieur d'un FormalParameterList d'un mode strict FunctionDeclaration ou FunctionExpression (13.1)
  • Un mode strict de la fonction ne peut pas avoir deux ou plusieurs paramètres formels qui ont le même nom. Une tentative de créer une telle fonction à l'aide d'un FunctionDeclaration, FunctionExpression, ou de la Fonction constructeur est une SyntaxError (13.1, 15.3.2).
  • Une mise en œuvre peut ne pas s'étendre, au-delà de ce qui est défini dans cette spécification, les significations, dans le mode strict fonctions de propriétés nommées les appelant ou les arguments de la fonction des cas. ECMAScript code ne pouvez pas créer ou modifier les propriétés de ces noms sur la fonction des objets qui correspondent à la mode strict fonctions (10.6, 13.2, 15.3.4.5.3).
  • C'est un SyntaxError à utiliser dans le mode strict code de la identificateurs eval ou des arguments comme l'Identifiant de l'FunctionDeclaration ou FunctionExpression ou comme un paramètre formel nom (13.1). Tenter de définir dynamiquement un tel mode strict de la fonction en utilisant la Fonction constructeur (15.3.2) lèvera une exception SyntaxError.

6voto

RENGANATHAN M G Points 443

Le mode Strict apporte plusieurs modifications à la normale JavaScript sémantique.

  • le mode strict élimine un peu de JavaScript silencieux erreurs en les modifiant afin de générer des erreurs.

  • le mode strict corrige les erreurs qui font qu'il est difficile pour les moteurs JavaScript pour procéder à des optimisations.

  • le mode strict interdit certains de la syntaxe susceptibles d'être définies dans les futures versions de ECMAScript.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X