以下のコードでは、配列内の項目ごとに新しい実行コンテキストが作成されますか、それとも実行コンテキストは同じままで、字句環境の環境レコードだけが更新されますか?
コードではエラーがスローされないため、新しいスコープ (レキシカル環境) は実行コンテキストとは独立して作成されると思いますが、それが正しいかどうかはわかりません。
標準ライブラリ関数に提供されるコールバックについては特別なことは何もありません。これらは依然として関数であり、関数を呼び出す通常の方法で呼び出されます。
forEach がそのコールバックを呼び出すとき)、新しい実行コンテキストが作成されます。
がそのコールバックを呼び出すとき)、新しい実行コンテキストが作成されます。
for-of ループを考えてみましょう: リーリー
ループを考えてみましょう:
forEach コールバックと同様に、関数呼び出しが必要ない場合でも、ループ反復ごとに新しい foo が存在することを意味します。 (これは、ブロック内にイベント ハンドラーまたは同様のイベント ハンドラーを作成する場合に非常に便利です。) (代わりに var を使用すると、毎回新しいハンドラー var# が作成されるわけではありません。 var はブロック スコープではないため、## はブロックから周囲の関数スコープまたはグローバル スコープにジャンプします。これは、新しいコードでは var を決して使用しないことをお勧めします。理由の 1 つは、 .)
コールバックと同様に、関数呼び出しが必要ない場合でも、ループ反復ごとに新しい
が存在することを意味します。 (これは、ブロック内にイベント ハンドラーまたは同様のイベント ハンドラーを作成する場合に非常に便利です。) (代わりに
を使用すると、毎回新しいハンドラー
var
標準ライブラリ関数に提供されるコールバックについては特別なことは何もありません。これらは依然として関数であり、関数を呼び出す通常の方法で呼び出されます。
###はい。関数を呼び出すたびに (この場合、forEach
(この場合) は、新しい実行コンテキストの作成とは別のものではありません。関数を呼び出すための標準手順の一部として。がそのコールバックを呼び出すとき)、新しい実行コンテキストが作成されます。
for-of
ここで呼び出すコールバック関数はありません。ループ本体は単なるブロックです。ただし、ブロック スコープ セマンティクスの定義方法により、ループ反復ごとに新しい字句環境オブジェクトが作成されます。これは、ループを考えてみましょう:
リーリーforEach
コールバックと同様に、関数呼び出しが必要ない場合でも、ループ反復ごとに新しい
fooが存在することを意味します。 (これは、ブロック内にイベント ハンドラーまたは同様のイベント ハンドラーを作成する場合に非常に便利です。) (代わりに
varを使用すると、毎回新しいハンドラー
var# が作成されるわけではありません。var
はブロック スコープではないため、## はブロックから周囲の関数スコープまたはグローバル スコープにジャンプします。これは、新しいコードではvar
を決して使用しないことをお勧めします。理由の 1 つは、 .)