З цим кодом:
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-бітної).
Це те, що двигун javascript у Chrome «розгладжує» функції, коли може?
Цікаво , якщо я додаю другу змінну , яка буде посилатися у внутрішній функції, то x
змінна ще НЕ визначена.
Я розумію, що часто використовуються примхи із визначенням обсягу та змінної при використанні інтерактивного налагоджувача, але мені здається, що на основі мовної специфікації повинно бути "найкращим" рішенням цих вигадок. Тож мені дуже цікаво, якщо це пов’язано з тим, що Chrome оптимізується далі, ніж Firefox. А також, можна легко відключити ці оптимізації під час розробки (можливо, їх слід було б відключити, коли відкриті інструменти розробки?).
Крім того, я можу відтворити це за допомогою точок прориву, а також debugger
заяви.
debugger;
лінія насправді не викликається зсередини bar
. Отже, подивіться на слід стека, коли він зупиняється в налагоджувачі: Чи bar
згадується функція в стектейрі? Якщо я маю рацію, то стек-трек повинен сказати, що він призупинений у рядку 5, у рядку 7, у рядку 9.
temp1
До консолі додається нова глобальна змінна, і ви можете використовувати її для доступу до запису області.