「呼び出し中のコンテキストは何ですか?」とは
-
23-12-2019 - |
質問
ECMA-262 5.1サブセクション 10.4.2 と
仕様の引用、強調鉱山:
10.4.2 EVALコードの入力
eval codeの実行コンテキストを入力したときに次の手順を実行します。
- 呼び出しコンテキストがない場合、またはevalコードが直接通話(15.1.2.1.1)で評価されていない場合は、
10.4.2.1厳密モード制限
EVALコードは、呼び出しコンテキストまたはEVALコードのコードのいずれかの呼び出しコンテキストの変数環境で変数または関数バインディングをインスタンス化できません。厳密なコードです。代わりに、そのようなバインディングは、EVALコードにのみアクセス可能な新しいVidelideNvironmentでインスタンス化されます。
-
これらの段落では、「呼び出し文脈」とはどういう意味ですか?これが実行コンテキストを参照すると仮定します。
eval
が呼び出されます。誰もがこれを検証できますか? -
「呼び出しの文脈なし」とはどういう意味ですか?誰かがCalling Contextのない
eval
の呼び出しをもたらす可能性のあるコードまたは条件の例を提供できますか?
解決
「呼び出しコンテキスト」とは、ネイティブのeval
関数が呼び出されているコンテキストを指します。
いくつかのネイティブコードからeval
を実行している場合(たとえば、何らかの理由でeval
を使用して完了したときにコードを実行するネイティブ関数を実行します)、コンテキストはありません。グローバルスコープコンテキストはECMAScript実行可能コードのみを参照します。
しかし、呼び出しコンテキストは、それが呼び出された場所の実行コンテキスト内の変数および指令を指す。たとえば、Calling Contextをチェックすると、evalが厳密なコードとして機能することを意図していることを知っています。
これは、
どのようにエバートコードは発信をしていないコンテキスト?
ES3言う:
10.2.2 EVALコード
制御が実行コンテキストに入ると EVALコード、以前のアクティブな実行コンテキストとは 呼び出しコンテキストは、スコープチェーン、変数を決定するために使用されます。 オブジェクト、およびこの値。呼び出し中のコンテキストがない場合、その後 スコープチェーン、変数のインスタンス化、および この値の決定は、グローバルコードに関して行われます。
私は「呼び出し中のコンテキストがない場合」によってバッフルされています。どうやってすることができます 可能性がありますか?
eval
が誰も呼び出されない場合はどうやって呼び出されますか?
応答:
ネイティブコードからの呼び出し、「ホスト」プログラム。
一部のブラウザは間接的な
eval
をサポートしています。これを許可します。.setTimeout(eval, 0, "alert('hi mom')");
使用されるウィンドウは、
setTimeout
が沿って見つけられたものです。 スコープチェーン、SOP>.myFrame.setTimeout(eval, 0, "alert(x)");
呼び出しフレームまたはウィンドウの
myFrame.x
ではなく、x
を表示する必要があります。
注:このインスタンスのmyFrame
とは、フレームのグローバルスコープを参照しています。