Z tym kodem:Dlaczego domyślna zmienna lokalna Chrome debuggera jest niezdefiniowana?
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
otrzymuję ten nieoczekiwany rezultat:
Kiedy zmienić kod:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
mogę uzyskać oczekiwany wynik:
Ponadto, jeśli w wewnętrznej funkcji istnieje połączenie z eval
, mogę uzyskać dostęp do mojej zmiennej tak, jak chcę (nie ma znaczenia, co przekazuję do eval
).
W międzyczasie narzędzia programistyczne Firefox dają oczekiwane zachowanie w obu okolicznościach.
Co jest w Chrome, że debugger zachowuje się mniej wygodnie niż Firefox? Obserwowałem to zachowanie przez jakiś czas, aż do wersji 41.0.2272.43 beta (wersja 64-bitowa).
Czy mechanizm javascript przeglądarki Chrome "spłaszcza" funkcje, gdy może?
Co ciekawe, jeśli dodam drugą zmienną, która jest odwołanie w funkcji wewnętrznej, zmienna x
jest nadal nieokreślone.
Rozumiem, że często występują dziwactwa z definicją zakresu i zmiennej podczas korzystania z interaktywnego debuggera, ale wydaje mi się, że w oparciu o specyfikację językową powinno istnieć "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 one zostać wyłączone, gdy narzędzia programistyczne są otwarte?).
Mogę również odtworzyć to z wartościami granicznymi, jak również z instrukcją debugger
.
Może to przyzwyczaić un zmienne z twojej drogi dla ciebie ... – dandavis
markle976 wydaje się mówić, że linia 'debugger;' nie jest tak naprawdę nazywana od m wewnątrz 'bar'. Tak więc spójrz na ślad stosu, gdy zatrzymuje się on w debugerze: czy funkcja 'bar' jest wymieniona w stosie? Jeśli mam rację, wtedy stacktrace powinien powiedzieć, że jest zatrzymany w linii 5, w linii 7, w linii 9. –
Nie sądzę, że ma to coś wspólnego z funkcjami spłaszczania V8. Myślę, że to tylko dziwactwo; Nie wiem, czy mógłbym to nazwać błędem. Myślę, że odpowiedź Davida poniżej ma sens. – markle976