Jshint: loopfunc & let/const

Créé le 15 févr. 2017  ·  7Commentaires  ·  Source: jshint/jshint

Certains problèmes (#1301 et #2225, peut-être d'autres) indiquent que cela a été résolu, mais la 2.9.4 avertit toujours de la fonction dans les boucles avec les éléments suivants :

const a = [], b = [];
for (let i in b) a.push(() => i);
for (let i of b) a.push(() => i);
for (let i = 0; i < 10; i++) a.push(() => i);

let i = 0;
while (i++ < 10) a.push(() => i);
P2

Commentaire le plus utile

J'utiliserai la méthode de

Cela dit, j'ai pensé fournir un autre exemple pour mettre en évidence les lacunes de cette règle :

function foo(myLoopArr)
{
    /* globals Promise: false */
    for(let val in myLoopArr)
    {
        const myPromArr = [];
        myPromArr.push(function() {
            return new Promise();
        });
    }
}

La fonction ci-dessus ne fait rien d'utile. Mais, surtout, aucune des valeurs de la boucle ne fait référence à des variables en dehors de la boucle. Et pourtant jshint lance l'avertissement :

 myPromArr.push(function() {
                                ^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.

Je pensais juste attiser le feu en soulignant que cet avertissement peut être invoqué dans des situations lexicalement saines.

Tous les 7 commentaires

Merci pour le rapport ! Malgré les commentaires sur les problèmes que vous avez mentionnés, je
ne peut pas trouver une version de JSHint où ce comportement a jamais été détendu correctement.

Aussi : le dernier exemple que vous avez partagé est un cas particulier qui ne devrait
autorisé:

let i = 0;
while (i++ < 10) a.push(() => i);

Le fait que la liaison i une portée lexicale ne signifie pas
protéger contre l'erreur loopfunc été initialement mis en œuvre pour éviter.
Les auteurs et lecteurs de code comme celui-ci peuvent s'attendre à ce que chaque fonction ait un
liaison i dédiée, mais en fait, ils partagent tous la même liaison. Si quelqu'un
est en mesure d'aider avec ce bug, s'il vous plaît n'oubliez pas d'en tenir compte
Cas.

Aussi : le dernier exemple que vous avez partagé est un cas particulier qui ne devrait pas être autorisé :

Tu as tout à fait raison... Comme c'est idiot de ma part... ^__^
À propos du vrai problème, attendons-nous que cela soit mis en œuvre ?

Nous n'avons aucune attente pour le moment. Souhaitez-vous aider?

Juste pour dire à tous ceux qui rencontrent cela : ce problème reste dans jshint 2.9.5.

Le code d'erreur qu'il produit est W083.

@overlookmotel -

Ma recommandation est soit de placer /*jshint loopfunc: true */ en haut de votre fichier .js, soit d'ajouter "loopfunc" : true, à vos paramètres .jshintrc . Cela ne résout pas vraiment le problème, mais s'il n'a pas été résolu après plus de 5 ans, ce n'est pas quelque chose qui peut ou sera résolu de si tôt.

J'utiliserai la méthode de

Cela dit, j'ai pensé fournir un autre exemple pour mettre en évidence les lacunes de cette règle :

function foo(myLoopArr)
{
    /* globals Promise: false */
    for(let val in myLoopArr)
    {
        const myPromArr = [];
        myPromArr.push(function() {
            return new Promise();
        });
    }
}

La fonction ci-dessus ne fait rien d'utile. Mais, surtout, aucune des valeurs de la boucle ne fait référence à des variables en dehors de la boucle. Et pourtant jshint lance l'avertissement :

 myPromArr.push(function() {
                                ^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.

Je pensais juste attiser le feu en soulignant que cet avertissement peut être invoqué dans des situations lexicalement saines.

@andrew-st-angelo-77media Bon travail pour rapporter ça. J'obtiens exactement la même erreur, même si ma fonction ne fait référence à aucune variable de portée externe. J'espère que cela sera pris en charge.

Cette page vous a été utile?
0 / 5 - 0 notes