4 votes

Avertissement concernant une variable locale inutilisée dans une fonction anonyme auto-exécutrice

Eclipse génère 'La variable locale n'est jamais lue' lorsqu'une variable est déclarée à l'intérieur d'une fonction anonyme auto-exécutoire, et ne le fait pas lorsqu'elle est déclarée dans la portée globale.

Exemple auto-exécutoire :

var MODULE = {};

(function (module) {

  // THIS LINE GENERATES WARNING
  var FOO_BAR_ANON = {};

  function Foo ( ) {

    if ( this instanceof Foo ) {

      // THIS IS WHERE VARIABLE IS USED
      this.fooBar = FOO_BAR_ANON;

    } else {
      return new Foo( );
    }
  }

  module['Foo'] = Foo;

})( MODULE );

Exemple de portée globale, aucun avertissement n'est généré :

var MODULE = {};

var FOO_BAR_GLOBAL = {};

function FooGlobal ( ) {

  if ( this instanceof FooGlobal ) {

    this.fooBar = FOO_BAR_GLOBAL;

  } else {
    return new FooGlobal( );
  }
}

MODULE['FooGlobal'] = FooGlobal;

Pourriez-vous, s'il vous plaît, expliquer pourquoi cet avertissement est généré en premier lieu, et comment le faire taire ?

3voto

amdn Points 5491

Il semble que ce soit un bogue connu dans Eclipse :

https://bugs.eclipse.org/bugs/show_bug.cgi?id=351470

FOO_BAR_ANON est capturé lorsque vous définissez la fonction Foo à l'intérieur de la fonction anonyme et la référence FOO_BAR_ANON dans Foo. Voir Fermetures documentation.

Voici l'exemple utilisé dans le rapport de bogue (à la fin de la page) :

(function() {
    var moveCaretTimer = -1;

    function setMask() {
        (function() {
            function focusEvent() {
                var moveCaret = function() {
                // empty
                };
                clearTimeout(moveCaretTimer);
                moveCaretTimer = setTimeout(moveCaret, 0);
            }
        })();
    }

    setMask.storageKey = storageKey;
})();

moveCaretTimer est marqué comme jamais lu, ses occurrences ne sont pas mises en évidence.

0voto

Shane Steinert Points 1

Si je me souviens bien de mon Javascript, la raison pour laquelle cela fonctionne dans le Global est que dans votre exemple auto-exécuté, la variable FOO_BAR_ANON est en dehors de la portée de la fonction Foo. Lorsque j'ai activé mon validateur JS dans Eclipse RSA, votre ligne

this.fooBar = FOO_BAR_GLOBAL ;

n'a pas pu résoudre à une valeur, parce que pour foo, la variable n'existe pas dans sa portée.

Aussi, pour supprimer cela, mes options pour Javascript étaient sous : Projet->Propriétés->JavaScript->Validation->Erreurs et avertissements.

Ici, vous pouvez personnaliser les avertissements qui sont lancés ou ignorés. Cela peut être différent dans votre version d'Eclipse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X