Pregunta

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

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

en lugar de:

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

Esto está sucediendo en algún lugar, no estamos seguros de dónde, y buscar el nombre de la variable en cuestión es difícil, ya que es una palabra común que aparece miles de veces en nuestra fuente.

¿Hay alguna manera de pedirle 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 romper la declaración.

He intentado crear una expresión de observación y esperaba poder convertirla en un punto de interrupción, pero parece que no puedo crear expresiones de observación 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.

¿Fue útil?

Solución

Proporcionó algunas cosas

  1. Conoces el nombre de la variable
  2. No tiene una variable con ese nombre en el ámbito global (funciones externas declaradas), sino solo funciones internas.
  3. Hay llamadas a la función que declara la variable.

este pequeño script haría el truco:

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

Obtendrá un rastro del código ejecutado antes de esa asignación.

Puede no informar algunas situaciones, así que eche un vistazo a JSLint . Cargue todos sus archivos JS allí mismo y guárdelos.

Otros consejos

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

Coloque este fragmento de Javascript en la parte superior de su página html, justo después de la etiqueta <head>:

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

Tenga en cuenta que window funciona en cualquier objeto Javascript (<=> es el objeto Javascript global).

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;
  }
});

Utilicé debugger en lugar de console.trace(), para poder detenerlo y mirarlo a mitad de la ejecución. Con <=> obtuve miles de millones 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 está configurando esa variable con el nombre de un elemento procesado.

Vea su página web en el navegador SeaMonkey (uso la versión 1.1.16) y mire la consola de error, 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: ##

Además de la depuración, le aconsejaría que verifique su código con JSLint , que informa asignaciones inesperadas en el ámbito global como errores.

Hay varios paquetes de línea de comandos de jslint, como jslint4java que se pueden usar multiplataforma en Scripts de compilación Ant .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top