セクション 13または ECMAScript 仕様 (v. 5)を見ています。無名関数式は次のように初期化されます。
FormalParameterListopt で指定されたパラメーターと FunctionBody で指定された本体を使用して、13.2 で指定された新しい Function オブジェクトを作成した結果を返します。実行中の実行コンテキストの LexicalEnvironment を Scope として渡します。FunctionExpression が厳密なコードに含まれている場合、またはその FunctionBody が厳密なコードである場合は、true を Strict フラグとして渡します。
このロジックは、関数宣言が初期化される方法と非常によく似ています。ただし、名前付き関数式の初期化がどのように異なるかに注意してください。
- funcEnv を、実行中の実行コンテキストのレキシカル環境を引数として渡して NewDeclarativeEnvironment を呼び出した結果とします。
- envRec を funcEnv の環境レコードとします。
- Identifier の String 値を引数として渡して、envRec の CreateImmutableBinding 具象メソッドを呼び出します。
- FormalParameterListopt で指定されたパラメーターと FunctionBody で指定された本体を使用して、13.2 で指定されているように新しい Function オブジェクトを作成した結果をクロージャーとします。Scope として funcEnv を渡します。FunctionExpression が厳密なコードに含まれている場合、またはその FunctionBody が厳密なコードである場合は、true を Strict フラグとして渡します。
- envRec の InitializeImmutableBinding 具象メソッドを呼び出して、Identifier の String 値とクロージャを引数として渡します。
- 閉鎖を返します。
名前付き関数式と無名関数式の大きな違いの 1 つは、名前付き関数式を関数内から再帰的に呼び出すことができることですが、私が考えることができるのはそれだけです。セットアップがこれほど異なるのはなぜですか? また、これらの追加の手順を実行する必要があるのはなぜですか?