web-dev-qa-db-fra.com

Resharper, Javascript: "Utilisation de la variable globale implicitement déclarée 'X'"

J'utilise les méthodes Web Resharper 6 et ASP.NET et j'ai un avertissement irritant dans mes fichiers Javascript:

"Use of implicitly declared global variable 'X'"

La raison en est que la méthode Web est créée en Javascript en tant que:

new X.example().webMethod(arg1, arg2, successCallback, failureCallback);

Et X ... est implicitement défini. Je me demande s'il existe une solution pour définir explicitement cela? Il est défini dans un fichier JS généré automatiquement, créé par le cadre de méthode Web ASP.NET.

Ma question est la suivante: comment puis-je supprimer l'erreur dans cette situation sans m'en débarrasser dans des situations légitimement fausses?

Merci!

43
rythos42

Lorsque j'utilise des symboles (fonctions, constantes, variables globales) définis dans d'autres fichiers JavaScript, je les passe à la "fonction de cadrage" du fichier actuel (fonction de niveau supérieur, généralement anonyme, qui empêche la pollution de l'espace de noms global) en tant que paramètres:

multiple containers

Comme vous pouvez le voir sur la capture d'écran, ReSharper (6.0.2202.688) est satisfait de jQuery, ContainerA et ContainerB même s'ils ne sont définis nulle part dans le fichier en cours. Le commentaire de la ligne 1 n’existe que pour JSLint (pas d’erreur).

Cette technique suppose que tous les autres fichiers JavaScript suivent la pratique recommandée par JavaScript de polluer de manière minimale l’espace de nom global en définissant un seul objet de niveau supérieur contenant tous les symboles exportés ( public ) (c’est-à-dire que jQuery est le seul objet global La bibliothèque jQuery et ses plugins, ContainerA est le seul objet global pour LibraryA, ContainerB est le seul objet global pour LibraryB, etc.).

Parce que vous n'avez clairement pas le contrôle sur les méthodes Web ASP.NET générant des fonctions de constructeur dans un espace de noms global, vous devez dans ce cas recourir au conteneur final, window:

window as a container

Ceci est une légère variation de la technique suggérée par @sethobrien dans son commentaire. Un avantage important (à mon humble avis) réside dans le fait que vous ne codez pas window.X en dur dans votre code. Au lieu de cela, votre code instancie les classes à partir du conteneur aspNet (ce qui pour le moment se trouve être un synonyme de window, mais cela pourrait changer dans le futur). De plus, le fait d'avoir aspNet.X dans le code indique plus clairement votre intention aux personnes qui liront votre code à l'avenir. Enfin, les minimiseurs JavaScript permettent de réduire les variables locales, ce qui donne un fichier légèrement plus petit transmis aux navigateurs clients.

41
Milan Gardian

Vous avez exactement le même problème après avoir déplacé Jasmine vers un paquet Bower externe et exclu le code de Jasmine du projet VS. Resharper a immédiatement commencé à se plaindre sur Use of an implicitly declared global variable 'describe' et ainsi de suite.

J'ai résolu ce problème en ajoutant au projet un autre fichier nommé workaround.js définitions factices pour les variables. Dans votre cas ce serait:

// This is a workaround for R# complaining on undefined global variables.
// In practice they come from and are defined by external frameworks, so 
// this is not a real issue.

var X = function () { };

Et ceci est un fichier dans mon projet - https://Gist.github.com/barahilia/62871d9219cee825d82e .

7
Ilia Barahovski

Ajouter ce qui suit en haut de votre fichier de script ///<refernce path="my.js" /> (my.js est le fichier où X est défini) corrigera probablement cet avertissement puisque ReSharper commence à voir cette variable globale.

Sinon, pour minimiser les modifications, vous pouvez ajouter var X = window.X; en haut du fichier. Essayez de ne pas poluter l’espace de noms global et assurez-vous qu’il ne confondra pas le code qui instancie réellement X sur la fenêtre.

5
Alexei Levenkov

Si c'est une erreur qui peut être ignorée, vous pouvez utiliser

// ReSharper disable once UseOfImplicitGlobalInFunctionScope
0
floralGhost