49 votes

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

Je suis l'aide de Resharper 6 et ASP.NET Web Méthodes et ont un irritant avertissement dans mes fichiers Javascript:

"Use of implicitly declared global variable 'X'"

La raison en est que la méthode web est créé en Javascript:

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

Et X...est implicitement défini. Je me demandais si il existe une solution de définir explicitement ce? Elle est définie dans certains auto-généré un fichier JS, créé par le ASP.NET méthode web cadre des trucs.

Ma question est: comment puis-je me débarrasser de l'erreur de cette situation, sans se débarrasser d'elle pour légitimement mal de situations?

Merci!

46voto

Milan Gardian Points 6596

Lors de l'utilisation de symboles (fonctions, des constantes, des variables globales) définies dans d'autres fichiers JavaScript, je passe pour le fichier en cours de la "portée de la fonction" (de haut niveau, généralement anonymes, fonction qui empêche l'espace de noms global de la pollution) comme paramètres:

multiple containers

Comme vous pouvez le voir dans la capture d'écran, ReSharper (6.0.2202.688) est heureux avec jQuery, ContainerA et ContainerB , même si elles ne sont pas définies de n'importe où dans le fichier actuel. Le commentaire de la ligne 1 n'est là que pour JSLint (pas d'erreurs).

Cette technique suppose que tous les autres fichiers JavaScript suivre le JavaScript meilleures pratiques de peu de polluer l'espace de noms global par la définition d'un unique objet de niveau supérieur qui contient tous les éléments exportés (public) symboles (c - jQuery est le seul objet global pour 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 de toute évidence, vous n'avez pas de contrôle sur ASP.NET Web Méthodes de génération de fonctions constructeur dans l'espace de noms global, dans votre cas, vous devez recourir à l'ultime conteneur, window:

window as a container

C'est une légère variante de la technique proposée par @sethobrien dans son commentaire. Un important (à mon humble avis) l'avantage est que vous n'êtes pas coder en dur window.X dans votre code. Au lieu de cela, votre code est l'instanciation de classes à partir de l' aspNet conteneur (qui pour le moment se trouve être un synonyme window, mais cela pourrait changer dans l'avenir). Aussi, ayant aspNet.X dans le code déclare votre intention plus clair pour les gens qui vont lire votre code dans l'avenir. Enfin, les variables locales peuvent être raccourcies par JavaScript minimizers rendement légèrement plus petit fichier transmis aux navigateurs clients.

8voto

Alexei Levenkov Points 49945

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; près du 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.

7voto

Ilia Barahovski Points 681

Eu exactement le même problème après le déplacement de Jasmin pour un externe Bower paquet et à l'exclusion de Jasmin du code de VS projet. Resharper 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 d'un autre fichier nommé workaround.js mannequin définitions pour les variables. Dans votre cas, il 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 c'est un fichier dans mon projet https://gist.github.com/barahilia/62871d9219cee825d82e.

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