Ответ 1
Когда вы говорите
function f () {}
Это выражение объявления функции. Эта функция будет определена в окружении. Итак, если он определен внутри другой функции, тогда функция будет определена внутри этой среды, где вы можете получить доступ к этой функции по имени.
Но, когда вы используете объявление функции в выражении, оно не будет рассматриваться как объявление функции, а выражение функции и будет оцениваться следующим образом (цитата из ECMA Script 5.1 Стандартная спецификация)
13 Определение функции: семантика
Производство
Выражение функции:
function Identifier ( FormalParameterListopt ) { FunctionBody }
оценивается следующим образом:
- Пусть funcEnv является результатом вызова NewDeclarativeEnvironment передачи запущенных контекстов выполнения Лексическая среда как аргумент
- Пусть envRec является записью среды funcEnvs.
- Вызовите CreateImmutableBinding (N) конкретный метод envRec, передав значение String идентификатора в качестве аргумента.
- Пусть замыкание является результатом создания нового объекта Function, указанного в 13.2, с параметрами, указанными FormalParameterListopt и телом, указанными FunctionBody. Перейдите в funcEnv как область действия. Перейдите в
true
как флаг Strict, если FunctionExpression содержится в строгом коде или если его FunctionBody является строгим кодом.- Вызовите InitializeImmutableBinding (N, V) конкретный метод envRec, передающий значение String идентификатора и закрытия в качестве аргументов.
- Возвратное закрытие.
Итак, когда вы создаете функцию в выражении,
-
будет создан новый контекст среды (см. первый пункт)
-
имя функции будет привязано к вновь созданной среде (см. третий элемент).
-
Тело функции будет использоваться для создания фактического объекта функции (см. четвертый элемент)
-
Созданный фактический объект функции привязан к имени функции во вновь создаваемом контексте (см. пятый элемент)
-
Затем возвращается объект функции.
Речь идет о назначении объекту функции переменной в контексте текущей среды для сохранения функции. В противном случае, когда оценка выражения будет выполнена, вновь созданный контекст среды станет недействительным. Таким образом, функция f
не будет видна снаружи.