Za pomocą tego kodu:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
Otrzymuję ten nieoczekiwany wynik:
Kiedy zmieniam kod:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
Otrzymuję oczekiwany wynik:
Ponadto, jeśli jest jakieś wywołanie eval
w funkcji wewnętrznej, mogę uzyskać dostęp do mojej zmiennej tak, jak chcę (nie ma znaczenia, do czego przekażę eval
).
W międzyczasie narzędzia deweloperskie Firefoksa zapewniają oczekiwane zachowanie w obu przypadkach.
Co jest z Chrome, że debugger zachowuje się mniej wygodnie niż Firefox? Obserwowałem to zachowanie od jakiegoś czasu, aż do wersji beta 41.0.2272.43 włącznie (wersja 64-bitowa).
Czy to dlatego, że silnik javascript Chrome „spłaszcza” funkcje, kiedy jest to możliwe?
Co ciekawe, jeśli dodam drugą zmienną, która jest odwołanie w funkcji wewnętrznej,x
zmienna jest nadal nieokreślone.
Rozumiem, że podczas korzystania z interaktywnego debuggera często pojawiają się dziwactwa związane z zakresem i definicją zmiennych, ale wydaje mi się, że w oparciu o specyfikację języka powinno być „najlepsze” rozwiązanie tych dziwactw. Jestem więc bardzo ciekawy, czy wynika to z dalszej optymalizacji Chrome niż Firefox. A także, czy te optymalizacje można łatwo wyłączyć podczas programowania (może powinny być wyłączone, gdy narzędzia deweloperskie są otwarte?).
Mogę również odtworzyć to z punktami przerwania, a także z debugger
instrukcją.
debugger;
linia nie jest wywoływana od wewnątrz bar
. Spójrz więc na ślad stosu, gdy zatrzymuje się w debugerze: Czy bar
funkcja jest wymieniona w stosie śledzenia? Jeśli mam rację, to ślad stosu powinien wskazywać, że jest wstrzymany w linii 5, w linii 7, w linii 9.
temp1
Do konsoli dołączona jest nowa zmienna globalna, której można użyć, aby uzyskać dostęp do wpisu zakresu.