web-dev-qa-db-fra.com

Dois-je «utiliser strict» pour chaque fonction javascript que j'écris?

Dois-je "utiliser strict" pour chaque fonction javascript que j'écris?

Quelle est la bonne pratique d'utiliser strict dans un grand projet AngularJS? L'utiliser à l'échelle mondiale peut casser une bibliothèque tierce qui ne la prend pas en charge, mais faire `` une utilisation stricte '' à chaque fois est juste beaucoup de répétitions.

25
Won Jun Bae

Sur cette question, méfiez-vous d'une tendance générale à trop simplifier.

Tout d'abord, tout votre code doit absolument être exécuté en mode strict. La fonctionnalité javascript moderne de base est modifiée (voir . Call () et apply () ) ou défigurée ( Erreurs silencieuses ) en exécutant du code en dehors du mode strict. (En savoir plus ici , de Crockford.)

Cependant, cela ne résout pas comment vous devez vous assurer que votre code s'exécute en mode strict. Il y a au moins deux contextes à considérer:

Dans le navigateur , votre code doit être livré après avoir été minifié. Si vous incluez 'use strict' dans chaque corps de fonction, votre minifieur ne le supprimera pas et vous gaspillerez des octets en le répétant partout. Vous n'en avez besoin que dans votre ou vos portées de fonction les plus externes - en haut de vos définitions de module. Une approche consiste à envelopper votre code minifié dans une seule fermeture IIFE dans le cadre du processus de génération:

;(function (){ 
  'use strict'
  // All code here.
}())

Cela, je pense, est proche de la manière idéale de le faire, mais cela dicte plus ou moins que vous adoptiez un flux de travail d'intégration continue (car, pour observer votre code s'exécuter en mode strict, vous devez tout avoir enveloppé d'une seule fermeture) . Si vous ne travaillez pas de cette façon, vous devrez inclure le use strict directive en haut de chaque fonction qui n'est pas déclarée dans la portée d'une autre fonction.

Sur le serveur , c'est beaucoup plus simple, bien sûr. Le code n'est pas minifié et les octets n'ont pas d'importance, vous pouvez donc simplement inclure le use strict directive en haut de chaque fichier.

Un mot d'avertissement sur --use_strict: Dans les cas où vous contrôlez la façon dont les scripts sont exécutés, vous pourriez être tenté d'utiliser le --use_strict indicateur d'exécution. C'est facile, mais cela signifie toutes les dépendances doit être conforme au mode strict. Étant donné que vous ne pouvez pas contrôler la conformité de chaque tiers, cela n'est généralement pas judicieux.

18
jeff_mcmahan

Tous code que vous écrivez1devrait être en mode strict . Il vous aide à détecter les erreurs en n'ignorant pas les exceptions.

Cependant, non , cela ne signifie pas que vous devez ajouter "use strict"; à chaque définition de function, vous ne devez le placer que dans la portée du module - une fois par fichier - afin qu'il soit hérité par toutes vos fonctions. Lorsque vous allez passer aux modules ES6 cela sera implicite de toute façon.

1: Je plaiderais même pour l'activer globalement, car le mode strict ne devrait pas casser le code correctement écrit.
Si cela le fait casse un script tiers, la solution pourrait ne pas être de désactiver à nouveau le mode strict…

13
Bergi

Réponse courte, oui! Vous n'avez pas besoin de l'inclure pour chaque fonction, mais vous pouvez simplement l'ajouter une fois par fichier JavaScript. Lorsque vous démarrez le fichier, commencez par une fermeture comme celle-ci:

(function () {
  "use strict";
  // Rest of your code.

})();

Non. La redondance n'est pas nécessaire. Utilisation de la déclaration

"use strict";

au niveau du fichier ou du flux est préférable, surtout si des bibliothèques tierces sont utilisées. Il permet de décider de les utiliser tels quels, de les envelopper ou de continuer à les utiliser.

Fonctions auto-exécutables au niveau du fichier

Il est de plus en plus courant de voir des fichiers ou des flux entiers dans des fermetures auto-exécutables. Dans de tels cas, la déclaration d'utilisation du mode strict (ci-dessus) est insérée dans la première ligne de la fermeture, où le ... est.

(function () { 
    ...
}())

Il peut être utile de mentionner que l'auto-exécution n'est pas toujours nécessaire et peut en fait entraîner des charges lentes et d'autres problèmes en cas de surutilisation.

Plus d'informations sur la portée de la déclaration

La portée de dépend de si vous placez la déclaration à l'intérieur ou à l'extérieur d'une fonction et s'applique à toutes les instructions suivant la déclaration dans la portée de la fermeture.

L'utilisation de la déclaration à l'intérieur de la fonction est la mauvaise façon de le faire si tout le fichier ou le flux est déjà compatible avec le mode plus strict ou peut être fait facilement. La redondance n'est pas nécessaire, il est donc recommandé de placer la déclaration en haut du fichier ou au début du flux.

Parfois, seules certaines fonctions sont conformes aux règles plus strictes. Dans de tels cas, la portée de fonction moins souhaitable de la déclaration peut être utilisée pour encourager des pratiques de codage plus fines au moins dans les fonctions qui sont déjà conformes.

Pourquoi un mode strict?

Le mode strict élimine certaines caractéristiques d'analyse et d'exécution de langage permissives jugées moins souhaitables du point de vue de la conception du langage. Ces caractéristiques de langage de mode non strict ont été jugées prudentes comme comportement par défaut pour la compatibilité descendante. Le synopsis et les détails apparaissent ici.

Il n'est pas défini sans ambiguïté quand et si ces anciennes caractéristiques linguistiques des premiers jours de Netscape seront dépréciées ou si le mode strict deviendra un comportement par défaut sur les navigateurs à un moment donné, mais le modèle plus strict est susceptible de produire une source moins ambiguë et moins risquée. Si vous souhaitez améliorer la maintenabilité, la portabilité et l'extensibilité dans les pratiques de codage et les bases de code, le mode strict est une bonne option.


[~ # ~] note [~ # ~] Pour ceux qui viennent ici de "Quel est l'avantage d'utiliser" function () 'use strict '”dans chaque fichier?"

Vous pouvez placer

"use strict";

en haut de la séquence de code ou à l'intérieur de la fonction, il n'y a donc qu'une seule ligne de code par fichier ou par fonction.

Les autres lignes de code ont d'autres objectifs dans le code ici .

  • Fonction auto-invoquante
  • Invocation d'usine

Certains placent le fichier entier dans une fonction auto-exécutable, mais ce n'est pas nécessaire dans tous les cas.

4
Douglas Daseeco