質問

ECMA-262 5.1サブセクション 10.4.2 10.4.2.1 "呼び出しコンテキスト"を参照してください。これは文書内の他の場所に記載されているとは思われません。

仕様の引用、強調鉱山:

10.4.2 EVALコードの入力

eval codeの実行コンテキストを入力したときに次の手順を実行します。

  1. 呼び出しコンテキストがない場合、または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が厳密なコードとして機能することを意図していることを知っています。

これは、 Brendan Eich (JavaScriptの作成者)が応答するES-Dispining Mailing Listでは、非常に似た質問によって明らかにされています。

どのようにエバートコードは発信をしていないコンテキスト?

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とは、フレームのグローバルスコープを参照しています。

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