2009-06-18 16 views
15

Tenemos una aplicación de JavaScript muy grande, donde después de muchos meses de codificación inevitablemente surgieron un par de deslizamientos donde se define una variable sin usar la palabra clave var de la siguiente manera :Haga que Firebug se rompa cuando se define una variable global x

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

en lugar de:

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

Esto está sucediendo en alguna parte - no estamos seguros donde - y buscando el nombre de la variable en cuestión es difícil, ya que es una palabra común que aparece 1000 de veces en nuestro alma rce.

¿Hay alguna manera de pedir a Firebug que rompa la línea que primero crea una variable global dada? Para aclarar, me gustaría romper exactamente en el instante en que window.x cambia de undefined a un valor definido, y para romper la instrucción.

He intentado crear una expresión de reloj y esperaba poder convertirla en un punto de interrupción, pero parece que no puedo crear expresiones de reloj sin algún tipo de contexto o alcance.

Si esto no es posible con Firebug, estaría interesado en cualquier cosa que pueda lograr esto en Firefox en general.

Respuesta

12

proporciona un par de cosas

  1. conoce el nombre de la variable
  2. Usted no tiene una variable con ese nombre en el ámbito global (declarado funciones fuera), pero sólo dentro de funciones.
  3. Hay llamadas a la función que declara la variable.

este pequeño script que hacer el truco:

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

Usted obtendrá una huella del código ejecutado antes de que la asignación.

Es posible que algunas situaciones no se notifiquen, por lo tanto, consulte JSLint. Cargue todos sus archivos JS allí y hágalos.

+0

¿Hay algún problema con el formateador de código? No puedo hacer que funcione con mi ejemplo. –

+0

sí, tienes que agregar muchos espacios antes de cada línea para formatearlo - tuve el mismo problema al ingresar mi pregunta :) – Maciek

+0

Muy buen enfoque (¡eso funciona!), Y gracias por hacerme descubrir el \ __ defineSetter \ __ " método "mágico". – Tibo

2

Aquí está la solución que terminé usando modificando la solución de Ionut G. Stan:

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

que utilizan debugger en lugar de console.trace(), por lo que podría detenerse y mirarlo mediados de ejecución. Con console.trace() recibí un bazillion de declaraciones de seguimiento debido a que esta línea se ejecutaba muchas veces.

El alcance con fugas resultó estar enterrado en Dojo, donde Dojo establece esa variable con el nombre de un elemento procesado.

+0

He usado "depurador" inicialmente, pero no pude ver la línea donde se asignó la variable, así que pensé que no te ayudaría. De todos modos, me alegro de poder ayudar. –

+0

Eso funciona genial, gracias. –

+0

+1 para actualizar la pregunta con lo que funcionó para usted. – GuruM

1

Ver su página web en el navegador Firefox (yo uso la versión 1.1.16) y un vistazo a la consola de errores, verá un mensaje de este tipo para cada asignación a una variable no declarada:

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

Además de la depuración, le aconsejo que verifique su código con JSLint, que informa las asignaciones inesperadas en el alcance global como errores.

Hay varios paquetes de línea de comandos de jslint, como jslint4java que se pueden usar multiplataforma en Ant build scripts.

2

Aquí hay otra solución que solo funciona en Firefox porque usa el método específico de Firefox watch.

poner este fragmento de código JavaScript en la parte superior de la página html, justo después de la etiqueta <head>:

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

Tenga en cuenta que watch funciona con cualquier objeto Javascript (window es el objeto global Javascript).

Cuestiones relacionadas