web-dev-qa-db-fra.com

Erreur JSLint: Déplacez toutes les déclarations 'var' en haut de la fonction

Le site JSLint a été mis à jour et je ne peux plus vérifier les scripts JS. Pour moi, cet avertissement n’est pas critique et je ne veux pas parcourir des milliers de lignes pour résoudre ce problème, je veux trouver des problèmes plus critiques.

Quelqu'un sait-il comment désactiver cette erreur ou utiliser l'ancienne version de JSLint?

METTRE À JOUR

Exemple:

function doSomethingWithNodes(nodes){
  this.doSomething();

  for (var i = 0; i < nodes.length; ++i){
    this.doSomethingElse(nodes[i]);
  }

  doSomething(); // want to find this problem
}

jslint.com sortie:

Error:
Problem at line 4 character 8: Move all 'var' declarations to the top of the function.

for (var i = 0; i < nodes.length; ++i){

Problem at line 4 character 8: Stopping, unable to continue. (44% scanned).

Problème:

Avoir des variables au-dessus des fonctions est une nouvelle exigence. Je ne peux pas utiliser JSLINT pour tester le code, car il arrête l'analyse du script en raison de cette erreur.

J'ai beaucoup de code et je ne veux pas menacer cet avertissement en tant qu'erreur critique.

UPDATE 22/08/2011: trouvé http://jshint.com , il a l'air beaucoup mieux que http://jslint.com/

76
Oleg Yaroshevych

Mise à jour juin 2017: Sous réserve d'assistance (par exemple, si vous n'exécutez pas JavaScript dans Internet Explorer 10 ou une version ultérieure), vous devriez envisager d'utiliser let au lieu de var

Par exemple: for(let i=0; ...; i++)


Il est impossible que je mette var i; à partir d'une for(var i=0; ...; i++) au sommet de mes fonctions. Surtout quand La spécification JavaScript l'a comme syntaxe acceptable dans la section for (12.6). En outre, c'est la syntaxe Brendan Eich utilise dans ses exemples.

L'idée de déplacer la déclaration vers le haut est qu'elle est censée refléter plus précisément ce qui se passe sous le capot, mais cela ne fera que refléter, pas affecter.

Pour moi, c’est une attente ridicule pour les itérations for. Cela est d'autant plus vrai que JSLint arrête le traitement lorsqu'il le détecte.

Il est discutable de savoir si les variables déclarées au sommet d'une fonction sont plus lisibles. Personnellement, je préfère que les variables d'itérateur soient déclarées lorsqu'elles sont utilisées. Je me fiche de savoir si la variable est déjà créée en interne, je l'initialise ici pour que je sois en sécurité. 

Je dirais que déclarer une variable itérateur où elles sont utilisées garantit qu'elles ne sont pas accidentellement rendues globales (si vous déplacez la boucle dans une autre fonction, la variable itérateur se déplace avec elle). Cela est beaucoup plus facile à gérer que de devoir conserver des déclarations de variable au sommet des fonctions.

Pour le moment, j'utilise http://www.javascriptlint.com/online_lint.php car cela semble se concentrer sur l'essentiel.

151
Lee Kowalkowski

En fait, le compilateur Google Closure ne détectera pas correctement le type de la variable de boucle d'une boucle for ... in sauf si elle est déclarée comme pour (var i in ...) et aucune annotation ne semble résoudre ce problème. La déclaration ne peut donc pas être déplacée. jusqu'au sommet.

7
jjrv

Vous pouvez télécharger les versions précédentes à tout moment, ou modifier la dernière version . Ce n'est pas si difficile, vraiment (recherche de move_var). Puis exécutez jslint localement, en utilisant node ou un navigateur avec un simple formulaire HTML - vous voudrez peut-être copier l'original de Crockford.

Notez que l'avertissement a été introduit dans le cadre d'un major rewrite , et ne se produit qu'après for(, de sorte que le message est un peu trompeur.

5
user123444555621

Notez que déplacer tous les vars vers le haut est différent de "autoriser une instruction var par fonction". L'obligation de déplacer toutes les variables vers le haut est nouvelle et ne semble pas avoir de commutateur. Plus d'informations sur http://groups.google.com/group/jsmentors/browse_thread/thread/5e90c25230f8e22/70e1a95a20fb829e

4
Paul Beusterien

J'ai eu ce problème sur ma base de code, lorsque nous avons voulu passer à la dernière version de JSLINT. Nous en avons eu beaucoup et les gens n'étaient pas contents de faire avancer la déclaration. Nous avons en fait trouvé que la solution la plus élégante était d’utiliser underscore.js et d’utiliser la fonction _.each () au lieu d’avoir la boucle complète verbeuse, ce qui supprimait l’erreur JSLint et rendait notre code plus fonctionnel, plus propre, plus étroit et plus facile à lis.

3

Même si new beta JSLint ne documente pas une directive de commentaire pour une tolérance var multiple dans une fonction, il semble que [ semble prendre en charge les directives de la version d'origine.

L'original JSLint vous permettait de faire ceci:

/*jslint vars: true */

D'après mon expérience, cela fonctionne toujours — je suppose pour la compatibilité ascendante. Le temps de cette écriture est Juin 2015.

1
Peter

J'ai trouvé que la syntaxe suivante obtiendrait l'erreur supprimée:

function doSomethingWithNodes(nodes) {
    this.doSomething();
    var i; // HERE is where you move the 'var' to the top of the function
    for (i = 0; i < nodes.length; ++i) {
        this.doSomethingElse(nodes[i]);
    }

    doSomething(); // want to find this problem
}
0
Gio