tldr: вам нужно иметь foo;
где-то в той же области локальной функции.
Кажется, что когда вы находитесь в контексте отладки, вы на самом деле НЕ имеете доступа ко всем переменным из лексического scope, а точнее только для тех, которые уже появились в этой локальной области функций.
В качестве примера возьмем этот сценарий:
const a = 'something';
(() => {
debugger;
})()
, при попытке вы получите ReferenceError
доступ к a
в отладочном репл.
Но если вы добавите a;
где-нибудь в области действия функции, это сработает.
const a = 'something';
(() => {
a;
debugger;
})()
Причина, по которой это произошло с вами, заключается в том, что объявления функций поднимаются («перемещаются в начало файла», но на самом деле также выходят за пределы локальной области функций), тогда как выражения функций не поднимаются (таким образом, уже «появились» в функции). Вот почему это будет работать, когда вы измените function foo () {
на const foo = function () {
.
То же самое произойдет для var y;
(все var
переменные внутренне перемещены вверх - подняты), но будет работать для var y = 1;
, поскольку оператор assign является своего рода «внешним видом».
Я не смог найти ничего об этом в Справочнике, но по собственному опыту отладчик работает так, по крайней мере, начиная с узла v6.