С помощью этого кода:Почему отладчик Chrome считает закрытую локальную переменную неопределенной?
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
я получаю этот неожиданный результат:
Когда я изменить код:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
я получить ожидаемый результат:
Кроме того, если во внутренней функции есть вызов eval
, я могу получить доступ к моей переменной, как я хочу сделать (не имеет значения, что я перехожу на eval
).
Между тем, инструменты Firefox dev дают ожидаемое поведение в обоих обстоятельствах.
Что случилось с Chrome, что отладчик ведет себя менее удобно, чем Firefox? Я наблюдал это поведение некоторое время, вплоть до версии 41.0.2272.43 beta (64-разрядная версия).
Является ли это тем, что механизм javascript Chrome «сглаживает» функции, когда это возможно?
Интересно, если добавить вторую переменную, которую имеет значение, указанную во внутренней функции, переменная x
по-прежнему не определена.
Я понимаю, что при использовании интерактивного отладчика часто возникают причуды с областью видимости и переменной определения, но мне кажется, что на основе спецификации языка должно быть «лучшее» решение этих причуд. Поэтому мне очень любопытно, что это связано с тем, что Chrome оптимизирован дальше Firefox. А также можно ли легко отключить эту оптимизацию во время разработки (возможно, они должны быть отключены, когда инструменты разработчика открыты?).
Кроме того, я могу воспроизвести это с точками останова, а также с заявлением debugger
.
может быть, он привыкает не- переменные из вашего пути для вас ... – dandavis
markle976, кажется, говорит, что строка 'debugger;' фактически не называется m внутри 'bar'. Итак, посмотрите на трассировку стека, когда она приостанавливается в отладчике: включена ли функция 'bar' в stacktrace? Если я прав, то стоп-трасса должна сказать, что она приостановлена в строке 5, в строке 7, в строке 9. –
Я не думаю, что это имеет какое-либо отношение к функциям выравнивания V8. Я думаю, что это просто причуда; Я не знаю, могу ли я назвать это ошибкой. Я думаю, что ответ Дэвида ниже имеет смысл. – markle976