JSLint signale soudainement: utilisez la forme de fonction «use strict»

930

J'inclus la déclaration:

"use strict";

au début de la plupart de mes fichiers Javascript.

JSLint n'a jamais mis en garde contre cela. Mais maintenant, c'est en disant:

Utilisez la forme de fonction "use strict".

Quelqu'un sait-il ce que serait la "forme de fonction"?

Zhami
la source

Réponses:

1010

Inclure 'use strict';comme première instruction dans une fonction d'habillage, de sorte qu'elle n'affecte que cette fonction. Cela évite les problèmes lors de la concaténation de scripts qui ne sont pas stricts.

Voir le dernier article de blog de Douglas Crockford, Strict Mode Is Coming To Town .

Exemple de ce poste:

(function () {
   'use strict';
   // this function is strict...
}());

(function () {
   // but this function is sloppy...
}());

Mise à jour: dans le cas où vous ne souhaitez pas encapsuler une fonction immédiate (par exemple, il s'agit d'un module de nœud), vous pouvez désactiver l'avertissement.

Pour JSLint (par Zhami ):

/*jslint node: true */

Pour JSHint :

/*jshint strict:false */

ou (selon Laith Shadeed )

/* jshint -W097 */

Pour désactiver tout avertissement arbitraire de JSHint, vérifiez la carte dans le code source de JSHint (détails dans la documentation ).

Mise à jour 2: JSHint prend en charge l' node:booleanoption. Voir .jshintrcsur github .

/* jshint node: true */
bdukes
la source
1
Dans JSLint pour Visual Studio, c'est l'option: "Autoriser global ES5 strict"
Jowen
10
Cela n'a cependant aucun sens pour les applications Node. -1
bevacqua
1
Salut Nico, j'ai mis à jour la réponse, pour le nœud, vous pouvez taper: / * jshint -W097 * / pour désactiver cet avertissement
Laith Shadeed
@LaithShadeed Une alternative serait /*jshint strict:false */de rendre plus clair ce que vous faites (à moins qu'il n'y ait un avantage particulier à votre code numérique que je ne connais pas)
bdukes
2
@Noumenon ce n'est pas vraiment du passe-partout, c'est une directive qui change l'environnement dans lequel votre code s'exécute. Cela dit, la nouvelle syntaxe ES6 (modules et classes) est stricte par défaut (voir ecma-international.org/ecma-262/6.0/ # sec-strict-mode-code ), donc à l'avenir, cela n'aura pas besoin d'être jonché partout. En attendant, vous pouvez envelopper tout votre code dans un IIFE pour n'avoir à spécifier "use strict";qu'une seule fois par fichier.
bdukes
217

Si vous écrivez des modules pour NodeJS, ils sont déjà encapsulés. Dites à JSLint que vous avez un nœud en incluant en haut de votre fichier:

/*jslint node: true */
Zhami
la source
2
Pour info, cette option fonctionne pour JSLint, mais JSHint ne désactive pas l'avertissement de rigueur avec cette directive. Pour JSHint, essayez/*jshint strict:false */
bdukes
4
Formulé pour moi avec JSHint v2.9.2. Ajouté "node": trueà .jshintrc
RyanM
71

Je suggère d'utiliser à la place jshint .

Il permet de supprimer cet avertissement via /*jshint globalstrict: true*/.

Si vous écrivez une bibliothèque, je ne suggérerais d'utiliser global strict que si votre code est encapsulé dans des modules comme c'est le cas avec nodejs.

Sinon, vous forceriez tous ceux qui utilisent votre bibliothèque en mode strict.

Thorsten Lorenz
la source
4
FYI: L'option globalstrict dans JSHint a changé. Essayez strict: 'global'maintenant et consultez jshint.com/docs/options/#globalstrict
Hovis Biddle
17

J'ai commencé à créer une application Node.js / browserify suite à l' article de blog JavaScript multiplateforme . Et je suis tombé sur ce problème, car mon tout nouveau Gruntfile n'a pas réussi jshint.

Heureusement, j'ai trouvé une réponse dans le livre de Leanpub sur Grunt :

Si nous l'essayons maintenant, nous analyserons notre Gruntfile… et obtiendrons quelques erreurs:

$ grunt jshint

Running "jshint:all" (jshint) task
Linting Gruntfile.js...ERROR
[L1:C1] W097: Use the function form of "use strict".
'use strict';
Linting Gruntfile.js...ERROR
[L3:C1] W117: 'module' is not defined.
module.exports = function (grunt) {

Warning: Task "jshint:all" failed. Use --force to continue.

Les deux erreurs sont dues au fait que le Gruntfile est un programme Node, et par défaut JSHint ne reconnaît pas ou n'autorise pas l'utilisation de moduleet la version de chaîne de use strict. Nous pouvons définir une règle JSHint qui acceptera nos programmes Node. Modifions notre configuration de tâche jshint et ajoutons une clé d'options:

jshint: {
  options: {
    node: true
  },
}

L'ajout node: truede jshint options, pour mettre jshint en "mode Node", a supprimé les deux erreurs pour moi.

qris
la source
16

Ajoutez un fichier .jslintrc (ou .jshintrc dans le cas de jshint) à la racine de votre projet avec le contenu suivant:

{
    "node": true
}
Sahil Ahuja
la source
15

Il n'y a rien de mal à la forme des chaînes.

Plutôt que d'éviter la forme stricte "globale" par souci de concaténer du javascript non strict, il est probablement préférable de simplement corriger le fichu javascript non strict pour qu'il soit strict.

glycoslave
la source
0

Je pense que tout le monde a raté la partie "soudainement" de cette question. Très probablement, votre .jshintrc a une erreur de syntaxe, il n'inclut donc pas la ligne «navigateur». Exécutez-le via un validateur json pour voir où se trouve l'erreur.

Dirigeable
la source
1
Non, c'est soudainement arrivé parce que le service en ligne JSLint a ajouté cette fonctionnalité en 2010 lorsque la question a été posée.
Quentin
0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

ajoutez ces lignes au point de départ de votre fichier

DB K
la source
-4

C'est aussi simple que cela: Si vous voulez être strict avec tout votre code, ajoutez-le "use strict";au début de votre JavaScript.

Mais si vous ne voulez être strict qu'avec une partie de votre code, utilisez le formulaire de fonction. Quoi qu'il en soit, je vous recommande de l'utiliser au début de votre JavaScript, car cela vous aidera à être un meilleur codeur.

Jason Stackhouse
la source
8
En fait, j'obtiens cette erreur lorsque je ne mets qu'en "use strict";haut de mon fichier JS, donc cela pourrait ne pas être entièrement vrai.
moesef
@moesef C'est parce que vous avez des erreurs dans votre code. Il est juste là pour vous aider à améliorer vos compétences de codage et à rendre votre code moins "lâche" ... il n'acceptera pas les variables non déclarées, etc ...
Jason Stackhouse
11
@JasonStackhouse: Pas vrai. JSLint n'acceptera pas la forme "globale" de "use strict";, où elle est simplement placée en haut de votre code. Il autorise uniquement "use strict;"lorsqu'il est enveloppé dans une fonction. (JS_Hint_ vous permet cependant d'utiliser le formulaire global - voir la réponse ci-dessus pour le paramètre nécessaire).
peterflynn