Ответ 1
Функция не является блоком. Блок (например), который следует за while
, for
или if
.
Во-первых, поймите, что объявления функций (function foo() {}
) подняты в верхней части области их содержащей функции (т.е. вы можете получить доступ к объявленным функциям по имени в любом месте той же области, что и декларация).:
foo();
function foo() { }
Этот код вне порядка 100% закончен, потому что объявление foo
поднимается выше вызова foo()
. Однако теперь представьте, что у вас есть условное объявление:
if(false) {
function foo() { }
}
С точки зрения языка, следует ли поднимать foo
? Поток программы никогда не войдет в блок, но мы обычно поднимаем все объявления. Из-за этой путаницы декларации внутри блоков не являются частью грамматики, определенной спецификацией ECMAScript (хотя каждая реализация поддерживает эту грамматику, но вызывает в каждом из них другой, нестандартный эффект).
Наличие функции внутри другой функции не несет этой путаницы:
function bar() {
function foo() { }
}
Очевидно, что foo
будет поднято до вершины bar
(всякий раз, когда он выполняется).
Таким образом, ваш первый пример отлично подходит.