Я просматриваю раздел 13 или спецификацию ECMAScript ( т. 5). Выражение анонимной функции инициализируется следующим образом:
Возвращает результат создания нового объекта Function, как указано в 13.2, с параметрами, указанными в FormalParameterListopt, и телом, указанным в FunctionBody. Передайте LexicalEnvironment текущего контекста выполнения в качестве Scope. Передайте true как флаг Strict, если FunctionExpression содержится в строгом коде или если его FunctionBody является строгим кодом.
эта логика очень похожа на то, как инициализируется объявление функции. Однако обратите внимание, насколько различается инициализация именованного функционального выражения.
- Пусть funcEnv будет результатом вызова NewDeclarativeEnvironment с передачей лексической среды текущего контекста выполнения в качестве аргумента.
- Пусть envRec будет записью среды funcEnv.
- Вызовите конкретный метод CreateImmutableBinding envRec, передав строковое значение Identifier в качестве аргумента.
- Пусть закрытие будет результатом создания нового объекта Function, как указано в 13.2, с параметрами, указанными в FormalParameterListopt, и телом, указанным в FunctionBody. Передайте funcEnv как Scope. Передайте true как флаг Strict, если FunctionExpression содержится в строгом коде или если его FunctionBody является строгим кодом.
- Вызовите конкретный метод InitializeImmutableBinding envRec, передав строковое значение Identifier и замыкание в качестве аргументов.
- Возвратное закрытие.
Я знаю, что одно из больших различий между именованными/анонимными функциональными выражениями заключается в том, что именованные функциональные выражения могут вызываться рекурсивно из самой функции, но это все, о чем я могу думать. Почему установка такая разная и зачем нужны эти дополнительные шаги?