質問

これは、次の名前を持つ名前付き関数式です。 test. 。内部では、私は割り当てます 123 名前も付けられた変数に test. 。それから test ログに記録されます。この関数はその本体をコンソールに表示しますが、 123. 。そのような行動の理由は何ですか?

(function test() {
  test = 123;
  console.log( test );
}());

関数実行の説明がどこで失敗しているのでしょうか?

  1. 関数の実行の開始: test 関数自体を参照するローカル変数です。
  2. ローカル変数 test 番号に再割り当てされます 123
  3. console.log(test) 番号を示します 123.
役に立ちましたか?

解決

私はこの部分を信じます ecmaの仕様 この動作を説明します。これは特に次のことに関連します 名前付き 関数式

生産

関数式 :関数識別子 (FormalParameterListopt) { FunctionBody }

は次のように評価されます。

  1. funcEnv を、実行中の実行コンテキストの字句環境を引数として渡して NewDeclarativeEnvironment を呼び出した結果とします。
  2. envRec を funcEnv の環境レコードとします。
  3. Identifier の String 値を引数として渡して、envRec の CreateImmutableBinding 具象メソッドを呼び出します。
  4. クロージャを、FormalParameterListopt で指定されたパラメータと FunctionBody で指定された本体を使用して、13.2 で指定された新しい Function オブジェクトを作成した結果とします。funcEnv をスコープとして渡します。FunctionExpression が strict コードに含まれている場合、または FunctionBody が strict コードである場合は、Strict フラグとして true を渡します。
  5. envRec の InitializeImmutableBinding 具象メソッドを呼び出し、Identifier とクロージャの String 値を引数として渡します。
  6. リターンクロージャー。

の用法 CreateImmutableBinding 名前付き関数式のスコープを作成するときに、識別子 (この場合は test) を不変変数として扱います。そのため、それに代入してもその値は変わりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top