С помощью этого кода:
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
все еще undefined.
Я понимаю, что при использовании интерактивного отладчика часто возникают причуды с определением области видимости и переменной, но мне кажется, что на основе спецификации языка должно быть "лучшее" решение этих причуд. Поэтому мне очень любопытно, что это связано с тем, что Chrome оптимизирован дальше Firefox. А также можно ли легко отключить эти оптимизации во время разработки (возможно, они должны быть отключены при открытии инструментов dev?).
Кроме того, я могу воспроизвести это с точками останова, а также с инструкцией debugger
.