2012-05-11 4 views
5

ECMAScript仕様では、"unique global object that is created before control enters any execution context"が定義されています。このグローバルオブジェクトは、ECMAScriptの標準組み込みオブジェクトであり、したがってネイティブオブジェクトです。ウェブブラウザでは、ウィンドウオブジェクトはネイティブのECMAScriptオブジェクトですか?

スペックも述べて:本明細書で定義されたプロパティに加えて、グローバル オブジェクトが追加のホスト定義されたプロパティを有していてもよい

。これは、値がグローバルオブジェクト自体である プロパティを含むことができます。たとえば、 HTMLドキュメントオブジェクトモデルでは、グローバルオブジェクトのwindowプロパティはグローバルオブジェクト自体 です。

ので、ウェブブラウザでは、windowオブジェクトは、ECMAScriptのグローバルオブジェクトのための単なる便利な名前であるため、windowオブジェクトは、ネイティブのECMAScriptオブジェクトです。

正しく取得できましたか?

答えて

5

これは、「ネイティブオブジェクト」または「ホストオブジェクト」であることが実際に何を意味するのかという問題に大部分が影響します。 ECMAScript仕様は、これらの用語のかなり抽象的な定義を提供しており、定義の解釈が異なる多くの余地があります。たとえば、ネイティブオブジェクトの定義では、実際に話す「セマンティクス」という単語は何ですか。それはプリミティブなオブジェクトセマンティクス([[propName]]内部プロパティで指定されたES内)か、オブジェクトのアプリケーションレベルのセマンティクスを含みますか? DOMウィンドウオブジェクトには、ES仕様では定義されていないアプリケーションレベルのセマンティクスがあるため、セマンティクスが「ネイティブオブジェクト」になることはありません。

答えは、実装のプラグマティックスの質問として見ると、はるかに簡単です。 ESエンジン実装者は、おそらく、ESヒープに割り当てられ、ESガベージコレクタによって管理されるオブジェクトが「ネイティブESオブジェクト」であると考えます。 「ホストオブジェクト」は、通常、ESヒープの外部に存在し、COM、XPCOM、またはV8組み込みAPIなどの相互運用性レイヤーを使用してアクセスされるものと考えられます。実装によっては、DOMウィンドウオブジェクトがいずれかのカテゴリに分類される可能性があります。この区別は、おそらく、仕様レベルの区別のどれよりも、エンジンの実装者とホストプロバイダの両方に関連しています。

ES仕様の次の版では、さらに明確な説明がある可能性があります。 "ネイティブ"と "ホスト"のオブジェクト用語を除外する提案もあります:http://wiki.ecmascript.org/doku.php?id=strawman:terminology。しかしながら、そのような定義が本当に実用的な影響を与えるかどうかは不明である。

+0

ええと、素晴らしい答え ':)' –

0

はい、あなたの推論は正しいと思われます。準証明として、明示的にthis( "グローバルコンテキスト")なしで関数を実行すると、そのthisは関数本体の中でwindowと評価されます。しかし、これは本当にJSVM固有のものです。たとえば、this v8-users message(および関連する議論)を見てください。物は背景の中でもう少し複雑ですが、あなたがユーザーに説明するようにほぼ見えます。

2

私は、グローバルオブジェクトがネイティブオブジェクトであることを仕様で要求しているとは(おそらく)考えています。セマンティクス完全にこの仕様ではなく、ホスト環境で定義されているECMAScriptの実装で

対象:としてスペックdefines a native object

そしてdefinition of a host object:ECMAScriptのの実行環境を完了するために、ホスト環境によって提供さ

オブジェクト。

ホスト・オブジェクト定義は確かにwindowに適用することができ、それはECMAScriptのの実行環境を完了するために、ホスト環境によって提供されたオブジェクトです。さらに、そのセマンティクスはECMAScript仕様では完全に定義されていません。

ブラウザで動作するECMAScriptエンジン(V8、TraceMonkeyなど)でwindowオブジェクトを作成しない場合もあります。むしろDOMによって提供されます(たとえば、DOMWindowまたはWindowから構築および継承されます)。

+1

しかし、 'window'オブジェクト*は、そのセマンティクス*が仕様によって完全に定義されているECMAScriptグローバルオブジェクトです*(' 'window'オブジェクト*と言うときは、 'グローバルプロパティですが、そのプロパティが参照するオブジェクトはグローバルオブジェクトです)。ホスト環境はグローバルオブジェクト(" window "、" document "、" alert "など)にプロパティを追加することができますが、そのセマンティクス完全に定義されていますか? –

+1

@ imeVidas:ECMAScript仕様でセマンティクスが完全に定義されているとは言えません。実際、 'window'オブジェクトのセマンティクスは、AbstractViewインタフェースからの継承を含め、[Window Object specification](http://www.w3.org/TR/Window/)で定義されています。一方で、あなたは非常に良い質問をしました。私は間違っている可能性もあります。ブレンドン・アイヒはどこですか? ;-) –

+0

[OK]を、少しバックアップしましょう。ブラウザでは、 'window'オブジェクト*は* ECMAScriptグローバルオブジェクトです、そうですか? (例えば、HTML文書オブジェクトモデルでは、グローバルオブジェクトの 'window'プロパティはグローバルオブジェクトです*。") –

関連する問題