Question

Nous avons une très grande application JavaScript qui, après de nombreux mois de codage, a inévitablement généré quelques ratés de la portée dans lesquels une variable est définie sans utiliser le mot clé var de la manière suivante:

function() {  
  x = 5; ...  
}

au lieu de:

function() {  
  var x = 5; ...  
}

Cela se passe quelque part - nous ne savons pas où - et il est difficile de rechercher le nom de la variable en question, car il s'agit d'un mot commun qui apparaît plusieurs milliers de fois dans notre source.

Existe-t-il un moyen de demander à Firebug d’interrompre la ligne qui crée d’abord une variable globale donnée? Pour clarifier, je voudrais interrompre au moment même où window.x passe de undefined à une valeur définie et interrompre la déclaration.

J'ai essayé de créer une expression de montre et espérais pouvoir en faire un point d'arrêt, mais je n'arrive pas à créer d'expressions de surveillance sans contexte ou portée.

Si cela n’est pas possible avec Firebug, tout ce qui peut permettre de réaliser cela dans Firefox en général m'intéresserait.

Était-ce utile?

La solution

Fourni quelques choses

  1. Vous connaissez le nom de la variable
  2. Vous n'avez pas de variable portant ce nom dans la portée globale (déclarée fonctions extérieures), mais uniquement à l'intérieur des fonctions.
  3. Il y a des appels à la fonction qui déclare la variable.

ce petit script ferait l'affaire:

<script type="text/javascript">
window.__defineSetter__("x", function(value) { console.trace(); });
x = 1;
</script>

Vous obtiendrez une trace du code exécuté avant cette affectation.

Certaines situations peuvent ne pas être signalées, consultez JSLint . Chargez tous vos fichiers JS ici et les froissez.

Autres conseils

Voici une autre solution qui ne fonctionne que dans Firefox car elle utilise le watch méthode.

Placez ce morceau de Javascript en haut de votre page html, juste après la <head> balise:

<script>
window.watch('x', function() { debugger });
</script>

Notez que window fonctionne sur tout objet Javascript (<=> est l'objet Javascript global).

Voici la solution que j'ai finalement utilisée en modifiant la solution de Ionut G. Stan:

window.__defineSetter__("name", function(value) {
  if (value=="div") {
    debugger;
  }
});

J'ai utilisé debugger au lieu de console.trace(), afin de pouvoir m'arrêter et le regarder en cours d'exécution. Avec <=> j’ai reçu un nombre incroyable d’instructions de suivi en raison de l’exécution répétée de cette ligne.

La portée qui a fui s’est avérée être enterrée dans Dojo, où Dojo définit cette variable sur le nom d’un élément traité.

Affichez votre page Web sur le navigateur SeaMonkey (j'utilise la version 1.1.16) et consultez la console d'erreur. Un message de ce type s'affiche pour chaque affectation à une variable non déclarée:

Warning: assignment to undeclared variable x
Source File: http://....js
Line: ##

En plus du débogage, je vous conseillerais de vérifier votre code avec JSLint , qui rapporte des tâches inattendues dans le périmètre global. comme des erreurs.

Il existe plusieurs ensembles de lignes de commande de jslint, tels que jslint4java , qui peuvent être utilisés. multiplate-forme dans les scripts de génération Ant .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top