web-dev-qa-db-fra.com

JSLint rapporte soudainement: utilisez la forme de fonction "use strict"

J'inclus la déclaration:

"use strict";

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

JSLint n'a jamais averti à ce sujet auparavant. Mais maintenant, il dit:

Utilisez la forme de fonction "use strict".

Est-ce que quelqu'un sait ce que la "forme de fonction" serait?

907
Zhami

Incluez 'use strict'; en tant que première instruction d'une fonction d'habillage, afin qu'elle ne concerne que cette fonction. Cela évite les problèmes lors de la concaténation de scripts non stricts.

Voir le dernier article de blog de Douglas Crockford Le mode strict arrive bientôt en ville .

Exemple tiré de ce post:

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

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

Mise à jour: Si vous ne souhaitez pas insérer de fonction immédiate (par exemple, il s'agit d'un module de noeud), vous pouvez désactiver l'avertissement.

Pour JSLint (per Zhami ):

/*jslint node: true */

Pour JSHint :

/*jshint strict:false */

ou (par Laith Shadeed )

/* jshint -W097 */

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

Mise à jour 2: JSHint prend en charge l'option node:boolean. Voir .jshintrc sur github .

/* jshint node: true */
989
bdukes

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

/*jslint node: true */
216
Zhami

Je suggérerais d'utiliser jshint à la place.

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

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

Sinon, vous forceriez tous les utilisateurs de votre bibliothèque à passer en mode strict.

70
Thorsten Lorenz

J'ai commencé à créer une application Node.js/browserify après la publication du blog Cross Platform JavaScript . Et je me suis heurté à ce problème, parce que mon tout nouveau Gruntfile n'a pas passé 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 nous obtiendrons des 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 fichier Grunt est un programme Node et que, par défaut, JSHint ne reconnaît ni n'autorise l'utilisation de module et de la version chaîne de use strict. Nous pouvons définir une règle JSHint qui acceptera nos programmes Node. Modifions la configuration de notre tâche jshint et ajoutons une clé d’options:

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

Ajouter node: true au jshint options, pour mettre jshint en "mode nœud", supprimait les deux erreurs pour moi.

17
qris

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

{
    "node": true
}
15
Sahil Ahuja

Il n'y a rien de mal à la forme.

Plutôt que d’éviter la forme stricte "globale" pour ne pas craindre de concaténer du javascript non strict, il est probablement préférable de corriger le foutu javascript pour qu’il soit strict.

15
glycoslave

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

0
Dirigible