同じ名前の名前付き関数式内の変数に値を代入できないのはなぜですか?
-
21-12-2019 - |
質問
これは、次の名前を持つ名前付き関数式です。 test
. 。内部では、私は割り当てます 123
名前も付けられた変数に test
. 。それから test
ログに記録されます。この関数はその本体をコンソールに表示しますが、 123
. 。そのような行動の理由は何ですか?
(function test() {
test = 123;
console.log( test );
}());
関数実行の説明がどこで失敗しているのでしょうか?
- 関数の実行の開始:
test
関数自体を参照するローカル変数です。 - ローカル変数
test
番号に再割り当てされます123
console.log(test)
番号を示します123
.
解決
私はこの部分を信じます ecmaの仕様 この動作を説明します。これは特に次のことに関連します 名前付き 関数式
生産
関数式 :関数識別子 (FormalParameterListopt) { FunctionBody }
は次のように評価されます。
- funcEnv を、実行中の実行コンテキストの字句環境を引数として渡して NewDeclarativeEnvironment を呼び出した結果とします。
- envRec を funcEnv の環境レコードとします。
- Identifier の String 値を引数として渡して、envRec の CreateImmutableBinding 具象メソッドを呼び出します。
- クロージャを、FormalParameterListopt で指定されたパラメータと FunctionBody で指定された本体を使用して、13.2 で指定された新しい Function オブジェクトを作成した結果とします。funcEnv をスコープとして渡します。FunctionExpression が strict コードに含まれている場合、または FunctionBody が strict コードである場合は、Strict フラグとして true を渡します。
- envRec の InitializeImmutableBinding 具象メソッドを呼び出し、Identifier とクロージャの String 値を引数として渡します。
- リターンクロージャー。
の用法 CreateImmutableBinding
名前付き関数式のスコープを作成するときに、識別子 (この場合は test
) を不変変数として扱います。そのため、それに代入してもその値は変わりません。
所属していません StackOverflow