2009-06-18 7 views
15

Nous avons une application JavaScript très volumineuse, où après plusieurs mois de codage, il y a inévitablement quelques erreurs de définition de portée lorsqu'une variable est définie sans utiliser le mot clé var de la façon suivante :Interruption de Firebug lors de la définition d'une variable globale x

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

au lieu de:

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

Ce qui se passe quelque part - nous ne savons pas où - et la recherche du nom de la variable en question est difficile, car il est un mot commun qui apparaît 1000s de fois dans notre sou rce.

Existe-t-il un moyen de demander à Firebug de casser la ligne qui crée d'abord une variable globale donnée? Pour clarifier, je voudrais rompre exactement à l'instant où window.x passe de undefined à une valeur définie, et à l'instruction break.

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

Si ce n'est pas possible avec Firebug, je serais intéressé par tout ce qui peut accomplir cela dans Firefox en général.

Répondre

12

a fourni un certain nombre de choses

  1. Vous connaissez le nom de la variable
  2. Vous ne disposez pas d'une variable avec ce nom dans la portée globale (déclarée en dehors des fonctions), mais seulement à 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.

Il se peut que certaines situations ne soient pas signalées, alors jetez un oeil à JSLint. Chargez tous vos fichiers JS ici et les peluches.

+0

Y at-il un problème avec le formateur de code? Je ne peux pas le faire fonctionner avec mon exemple. –

+0

ouais vous devez ajouter beaucoup d'espaces avant chaque ligne pour le faire formaté - eu le même problème en entrant ma question :) – Maciek

+0

Très belle approche (qui fonctionne!), Et merci de me faire découvrir le \ __ defineSetter \ __ " méthode magique ". – Tibo

2

Voici la solution que je fini par utiliser en modifiant la solution de Ionut G. Stan:

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

J'utilisé debugger au lieu de console.trace(), donc je pourrais arrêter et regarder la mi-exécution. Avec console.trace() j'ai reçu un bazillion trace instructions en raison de cette ligne s'exécutant plusieurs fois.

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

+0

J'ai d'abord utilisé "débogueur", mais je ne pouvais pas voir la ligne où la variable a été affectée, donc je pensais que cela ne vous aidera pas. En tout cas, je suis content que je puisse aider. –

+0

Cela fonctionne très bien, merci. –

+0

+1 pour mettre à jour la question avec ce qui a fonctionné pour vous. – GuruM

1

Voir votre page web sur le navigateur SeaMonkey (j'utilise la version 1.1.16) et regardez la console d'erreur, vous verrez un message de ce type pour chaque affectation à une variable non déclarée:

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

En plus du débogage, je conseillerais de vérifier votre code avec JSLint, qui signale les affectations inattendues dans la portée globale comme des erreurs.

Il existe plusieurs ensembles de lignes de commande de jslint, tels que jslint4java, qui peuvent être utilisés multiplate-forme au Ant build scripts.

2

Voici une autre solution qui ne fonctionne que dans Firefox car elle utilise la méthode watch spécifique à Firefox.

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

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

Notez que watch fonctionne sur tous les objets Javascript (window est l'objet global Javascript).

Questions connexes