Pergunta

Nós temos uma grande aplicação JavaScript, onde, depois de muitos meses de codificação não têm inevitavelmente surgido um escopo casal deslizes onde uma variável é definida sem utilizar a palavra-chave var da seguinte forma:

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

em vez de:

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

Isso está acontecendo em algum lugar - não temos certeza onde -. E procurando o nome da variável em questão é difícil, já que é uma palavra comum que aparece 1000s de vezes em nossa fonte

Existe uma maneira de pedir Firebug para quebrar na linha que primeiro cria uma variável global? Para esclarecer, eu gostaria de quebrar exatamente no instante em que window.x muda de undefined a um valor definido, e para quebrar comunicado.

Eu tentei criar uma expressão relógio e esperava que eu pudesse transformá-lo em um ponto de interrupção, mas eu não consigo criar expressões de inspeção sem algum tipo de contexto ou escopo.

Se isto não é possível com Firebug, eu estaria interessado em qualquer coisa que pode fazer isso no Firefox em geral.

Foi útil?

Solução

Desde algumas coisas

  1. Você sabe o nome da variável
  2. Você não tem uma variável com esse nome no escopo global (declarado funções fora), mas apenas dentro de funções.
  3. Há chamadas para a função que declara a variável.

este pequeno script seria fazer o truque:

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

Você vai ter um traço do código executado antes que a atribuição.

Pode deixar de denunciar algumas situações, então dê uma olhada JSLint . Coloque todos os arquivos seu JS ali e fiapos-los.

Outras dicas

Aqui está outra solução que só funciona no Firefox porque ele usa o específico do Firefox watch .

Coloque este pedaço de Javascript no topo de sua página html, logo após a tag <head>:

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

Note que as obras watch sobre qualquer objeto Javascript (window é o objeto global Javascript).

Aqui está a solução acabei usando modificando a solução da Ionut G. Stan:

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

Eu costumava debugger vez de console.trace(), para que eu pudesse parar e olhar para ele no meio da execução. Com console.trace() eu tenho um instruções de rastreamento bazillion devido a esta linha de execução muitas vezes.

O escopo de fuga acabou por ser enterrado em Dojo, onde Dojo está definindo essa variável para o nome de um elemento processado.

Veja a sua página web no navegador SeaMonkey (eu uso a versão 1.1.16) e olhar para o console de erro, você verá uma mensagem deste tipo para cada atribuição para uma variável não declarada:

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

Além de depuração, eu aconselharia a verificar o seu código com JSLint , que relata as atribuições inesperadas no escopo global como erros.

Existem vários feixes de linha de comando de JSLint, tais como jslint4java que podem ser utilizados multi-plataforma em Ant scripts de construção .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top