@Apl-by

Почему декларативная функция видна вне блочной области видимости и так себя ведет?

Почему декларативная функция видна вне блока при таком коде:
{
  function b() { };
  b = 'foo';
}

console.log(b); // результат ƒ b() { }

Причём, если записать:
{
  b = 'foo';
  function b() { };
}

console.log(b); // то результат - 'foo'

Если в первом варианте добавить в код какую-нибудь строку дополнительно:
{
  function b() { };
  b = 'foo';
  let any;
}

то можно увидеть в дебагере, что переопределение для b = 'foo' происходит, но результат в консоли вне данной области всё равно ƒ b() { }. Почему так?
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Apl-by Автор вопроса
В общем, вероятно здесь действительно дело в hoisting, и Дмитрий Беляев прав. Немного по-экспериментировал, и сделал такой вывод(если ошибаюсь поправьте).
При начале чтения блока с кодом, Js осуществляет hoisting декларативных функций и объявлений переменных в рамках видимости читаемого блока, не затрагивая сразу изолированные подблоки, которые есть в коде. Далее, когда Js добирается до подблока, опять происходит hoisting в рамках данного подблока для переменных, а декларативная функция всплывает в глобальную область видимости. Причем похоже,что процесс всплытия для функции происходит дважды. Например для:
{
//произошло всплытие b = ƒ b() { } в глобальную область сразу
  1.  function b() { }; // повторно вынесло  b = ƒ b() { } в глобальную область
  2.  b = 'foo'; // переназначено значение переменной b = 'foo' в рамках данной области
  3.  let any;
}
  4.  console.log(b); // как результат ƒ b() { }

И второй случай:
{
//произошло всплытие b = ƒ b() { } в глобальную область сразу
1.  b = 'foo'; // переназначено значение переменной b = 'foo' в рамках данной области  
2.  function b() { }; // повторно вынесло  b в глобальную область, но значение для b уже было b = 'foo'
3.  let any;
}
 4. console.log(b); // как результат b = 'foo'

Хз, вроде подогнал логику под свои эксперименты. И все же не совсем правильно у меня описано скорее всего. "Повторный вынос" декларативной функции вряд ли можно назвать всплытием. Может и вообще всё по-другому объясняется. Но работает по факту так :/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
Rocket Брянск
от 60 000 до 100 000 ₽
22 мая 2024, в 17:27
1000 руб./за проект
22 мая 2024, в 17:25
600 руб./за проект