Итак у нас есть три функции в которых выполняются какие-то действия, после чего они вызываются. В итоге нам нужно выяснить, что будет в консоли.
Давайте пройдемся по коду и разберемся, что происходит.
- Создается функция foo, в которой создаются две переменные. Тут главное обратить внимание на то как они создаются. Если с переменной a всё понятно, она создается в области видимости функции. При этом она создается как let, т.е. за пределами этой функции её не должно вообще существовать. Таким образом можно сразу сказать что console.log(a); выдаст ошибку, о том, что такой переменной не существует.
Теперь посмотрим, что идёт после равно, мы видим что без ключевого слова let (const || var) указывается ещё одна переменная. По идеи, можно было подумать, что она тоже будет создана как let, но на самом деле, она будет создана как глобальная переменная var, при этом если не запускать эту функцию переменная b создана не будет, можно даже больше сказать если до запуска функции, проверить существует ли эта переменная, тогда тоже будет ошибка.
Как видно из картинки, в консоли будет, что такая переменная не существую и hosting, тут не сработает, потому что она создается фактически глобально, но из другой области видимости, которая на текущий момент ещё не создана и по этому на b ещё не существует. Переменная b не будет существовать пока не произойдет вызов функции, после чего переменная станет глобальной и будет видна.
Что касаемо console.log(b) результат будет равен 5.
2. Функция bar, здесь создается переменная с, создается с ключевым словом var, это обычная переменная которая создается в области видимости функции за пределами которой переменная c не существует. Даже не смотря на то, что она создана как var.
Результат console.log(c) это ошибка, точно такая же как в первом результате с переменной a.
3. Последняя функция baz. Тут происходит абсолютно тоже самое что и с переменной b, создается глобальная переменная d.
Результат console.log(d) будет равен 20.
Вот такая интересная задача, на понимание как работает область видимости, hosting и объявление переменной без ключевого слова.