2009-06-18 18 views
15

Mamy bardzo dużą aplikację JavaScript, gdzie po wielu miesiącach kodowania nieuchronnie wyskoczył kilka przeskoków zakresu, w którym zmienna jest zdefiniowana bez użycia słowa kluczowego var w następujący sposób :Mieć Firebug zerwania, gdy globalna zmienna x jest zdefiniowana

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

zamiast:

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

dzieje się to gdzieś - nie jesteśmy pewni, gdzie - i szukając zmiennej nazwa jest trudne, ponieważ jest to powszechne słowo, które pojawia się ponad 1000 razy w naszym sou rce.

Czy istnieje sposób, aby poprosić Firebug, aby przerwał linię, która tworzy najpierw daną zmienną globalną? Aby wyjaśnić, chciałbym włamać się dokładnie w momencie, gdy window.x przełącza się z undefined na zdefiniowaną wartość, a także na instrukcję break.

Próbowałem utworzyć wyrażenie zegarka i miałem nadzieję, że mogę zmienić go w punkt przerwania, ale nie mogę tworzyć wyrażeń zegarka bez pewnego kontekstu lub zakresu.

Jeśli nie jest to możliwe w Firebug, byłbym zainteresowany wszystkim, co może to zrobić w ogóle w Firefoksie.

Odpowiedz

12

dostarczono kilka rzeczy

  1. Wiesz nazwę zmiennej
  2. Nie masz zmienną o tej nazwie w zasięgu globalnym (zadeklarowanej funkcji na zewnątrz), ale tylko wewnątrz funkcji.
  3. Istnieją wywołania funkcji deklarującej zmienną.

ten mały skrypt by rade:

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

dostaniesz śladu wykonywanego kodu przed tym zadaniem.

Może nie być możliwe zgłoszenie niektórych sytuacji, więc spójrz na numer JSLint. Załaduj wszystkie pliki JS tam i zwiń je.

+0

Czy coś jest nie tak z programem do formatowania kodu? Nie mogę zmusić go do pracy z moim przykładem. –

+0

tak, musisz dodać dużo spacji przed każdym wierszem, aby go sformatować - czy ten sam problem pojawił się w moim pytaniu :) – Maciek

+0

Bardzo fajne podejście (to działa!) I dzięki za to, że odkryłem \ __ defineSetter \ __ " magiczna "metoda. – Tibo

2

Oto rozwiązanie skończyło się używając modyfikując rozwiązanie Ionut G. Stana:

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

użyłem debugger zamiast console.trace(), więc mogłem się zatrzymać i spojrzeć na to w połowie realizacji. Wraz z console.trace() otrzymałem instrukcje śledzenia bazillionu z powodu wykonywania tej linii wiele razy.

Nieszczelny zasięg został zakopany w Dojo, gdzie Dojo ustawia tę zmienną na nazwę przetwarzanego elementu.

+0

Użyłem początkowo "debuggera", ale nie widziałem linii, do której przypisano zmienną, więc pomyślałem, że to ci nie pomoże. W każdym razie cieszę się, że mogłem pomóc. –

+0

To działa świetnie, dzięki. –

+0

+1 za aktualizację pytania o to, co zadziałało. – GuruM

1

wyświetlić stronę internetową w przeglądarce SeaMonkey (używam wersji 1.1.16) i spojrzeć na konsoli błędów, pojawi się komunikat o tego typu dla każdego przypisania do zmiennej nierejestrowanej:

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

Oprócz debugowania, radzę sprawdzić kod za pomocą JSLint, który zgłasza nieoczekiwane przypisania w zasięgu globalnym jako błędy.

Istnieje kilka pakietów wiersza polecenia jslint, takich jak jslint4java, które mogą być używane między różnymi platformami w Ant build scripts.

2

Oto kolejne rozwiązanie, które działa tylko w przeglądarce Firefox, ponieważ używa specyficznej dla Firefoksa metody: watch.

umieścić ten kawałek JavaScript na samej górze strony html, tuż po tagu <head>:

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

Zauważ, że watch działa na każdym obiekcie Javascript (window to globalny obiekt JavaScript).