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