/
336.txt
288 lines (219 loc) · 18.2 KB
/
336.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
* 仕様書
[REFS[
-[2] [CITE[ECMAScript Language Specification (HTML version)]] ([TIME[2009-04-03 04:43:48 +09:00]] 版)
-- '''<http://bclary.com/2004/11/07/#a-15.1>'''
-- <http://bclary.com/2004/11/07/#annex-b>
- [76] [CITE[Web IDL (Second Edition)]] ([TIME[2015-05-27 01:29:33 +09:00]] 版) <http://heycam.github.io/webidl/#es-security>
- [10] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#global-object>
- [23] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2013-07-29 23:11:14 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#javascript-global-environment>
- [24] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2013-07-29 23:11:14 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#dom-showmodaldialog>
]REFS]
* 呼称
[25] [DFN[JavaScript [RUBYB[大域環境]@en[global environment]]]]は、
[[JavaScript]] の仕様書における[DFN[[RUBYB[大域環境]@en[global environment]]]]と同義です [SRC[>>23]]。
[82] [[Web IDL]] は [DFN[ECMAScript [RUBYB[大域環境]@en[global environment]]]]と呼んでいます。
* 大域環境の一覧
[22] [[JavaScript大域環境]]には次の種類があります。それぞれ異なる種類の[[大域オブジェクト]]を用いています。
[FIG(table)[
:env:[[大域環境]]名
:obj:[[大域オブジェクト]]の[[インターフェイス]]
:name:[[大域名]]
:env:[18] [RUBYB[[[文書環境]]]@en[document environment]] [SRC[>>23]]
:obj:[CODE(DOMi)@en[[[Window]]]]
:name:[CODE(DOMi)@en[[[Window]]]]
:env:[19] [RUBYB[[[ワーカー環境]]]@en[worker environment]] [SRC[>>23]]
:obj:[CODE(DOMi)@en[[[WorkerGlobalScope]]]]
:name:-
:env:[20] :... [RUBYB[[[専用ワーカー環境]]]@en[dedicated worker environment]] [SRC[>>23]]
:obj:[CODE(DOMi)@en[[[DedicatedWorkerGlobalScope]]]]
:name:[CODE(IDL)@en[[[Worker]]]], [CODE(IDL)@en[[[DedicatedWorker]]]]
:env:[21] :... [RUBYB[[[共有ワーカー環境]]]@en[shared worker environment]] [SRC[>>23]]
:obj:[CODE(DOMi)@en[[[SharedWorkerGlobalScope]]]]
:name:[CODE(IDL)@en[[[Worker]]]], [CODE(IDL)@en[[[SharedWorker]]]]
:env:[67] :... [RUBYB[[[サービスワーカー環境]]]@en[service worker environment]]
:obj:[CODE(DOMi)@en[[[ServiceWorkerGlobalScope]]]]
:name:[CODE(IDL)@en[[[Worker]]]], [CODE(IDL)@en[[[ServiceWorker]]]]
]FIG]
[26] 特記なき場合 [[JavaScript大域環境]]は[[文書環境]]です [SRC[>>23]]。
[CODE(DOMi)@en[[[Window]]]] は、[[一次大域インターフェイス]]です。
[36] [[ワーカー環境]]は3つの環境の総称で、これ単独で用いられることはありません。
[27] >>18 の特殊ケースとして、[[大域オブジェクト]]が [CODE(DOMi)@en[[[Window]]]] と [CODE(DOMi)@en[[[WindowModal]]]]
の両方を[[実装]]したオブジェクトとなる [SRC[>>12]] ことがあります。
;; [28] [[ウィジェット実現値]]では [CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]が [CODE(DOMi)@en[[[WindowWidget]]]]
も[[実装]]することになっています。
[57] [[大域オブジェクト]]を識別する名前を[DFN[[RUBYB[[[大域名]]]@en[global name]]]]といいます。
[[大域名]]は [CODE(IDL)@en[[[Global]]]] [[拡張属性]]や [CODE(IDL)@en[[[PrimaryGlobal]]]]
[[拡張属性]]に[[識別子リスト]]として指定することができます。
明示されていない場合、[[インターフェイス]]の名前が[[大域名]]となります。
[60] [[大域名]]には制約がなく、複数の[[インターフェイス]]に同じ[[大域名]]を与えることもできます。
[64] [[大域名]]は [CODE(IDL)@en[[[Exposed]]]] [[拡張属性]]で[[大域オブジェクト]]を指定するために使われます。
;; [81] [[大域名]]は [[Web IDL]] による定義のための仕様書内の情報であり、
実装により[[著者]]から観測可能なものではありません。
[43] ある文脈で適用される[[大域環境]]のことを[[現在大域環境]]といいます。
* JavaScript 大域実行文脈
[30] [[スクリプト]]の[[設定群オブジェクト]]の[[大域オブジェクト]]が [CODE(DOMi)@en[[[Window]]]]
の時、 [[JavaScript]] の[[大域実行文脈]]の [CODE(JS)@en[[[ThisBinding]]]] ([CODE(JS)@en[[[this]]]])
はその [CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]自体ではなく、その [CODE(DOMi)@en[[[Window]]]]
[[オブジェクト]]の [CODE(DOMi)@en[[[WindowProxy]]]] [[オブジェクト]]としなければ[['''なりません''']]。
[SRC[>>10]]
;; [31] [[ES5]] 仕様上は[[大域オブジェクト]]自体が [CODE(JS)@en[[[this]]]] によって返されることになっていますが、
実際の [[Webブラウザー]]上は [CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]に[[スクリプト]]がアクセスすることができず、
常に代わりに [CODE(DOMi)@en[[[WindowProxy]]]] [[オブジェクト]]が返されることになっています。
これは [[ES]] 仕様書に対する [[HTML Standard]] の[[意図的違反]]です [SRC[>>10]]。
* 状態
[75] [[大域オブジェクト]]は次の状態を持ちます。
[FIG(list members)[
:[[環境設定群オブジェクト]]:本[[大域オブジェクト]]に対応する[[環境設定群オブジェクト]]です
(>>11)。
:[35] [[エラー報告モード]]:
[[大域オブジェクト]]は[[エラーの報告]]の[[対象]]となることがあります。
[[エラーの報告]]の[[対象]] (>>34) は[[エラー報告モード]]になることがあります。
:[[Blob URL Store]]:
]FIG]
** JavaScript 大域オブジェクトの内部特性
[4]
:[CODE(JS)@en[[['''[''''''['''Call''']'''''']''']]]]:なし [SRC[[[ES3]] 15.1]]
:[CODE(JS)@en[[['''[''''''['''CanPut''']'''''']''']]]]:標準 [SRC[[[ES3]] 18.6.2.3]]
:[CODE(JS)@en[[['''[''''''['''Class''']'''''']''']]]]:[[実装依存]] [SRC[[[ES3]] 15.1]]
:[CODE(JS)@en[[['''[''''''['''Construct''']'''''']''']]]]:なし [SRC[[[ES3]] 15.1]]
:[CODE(JS)@en[[['''[''''''['''Default''']'''''']''']]]]:標準 [SRC[[[ES3]] 18.6.2.6]]
:[CODE(JS)@en[[['''[''''''['''Delete''']'''''']''']]]]:標準 [SRC[[[ES3]] 18.6.2.5]]
:[CODE(JS)@en[[['''[''''''['''Get''']'''''']''']]]]:標準 [SRC[[[ES3]] 18.6.2.1]]
:[CODE(JS)@en[[['''[''''''['''HasProperty''']'''''']''']]]]:標準 [SRC[[[ES3]] 18.6.2.4]]
:[CODE(JS)@en[[['''[''''''['''Prototype''']'''''']''']]]]:[[実装依存]] [SRC[[[ES3]] 15.1]]
:[CODE(JS)@en[[['''[''''''['''Put''']'''''']''']]]]:標準 [SRC[[[ES3]] 18.6.2.2]]
** JavaScript 大域オブジェクトのメンバー
[3]
,[CODE(JS)@en[[[Array]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[Boolean]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[Date]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[decodeURI]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[decodeURIComponent]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[encodeURI]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[encodeURIComponent]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[escape]]]],[[ECMA]] [[標準]] ([[参考]]),[[ES3]] ([[参考]])
,[CODE(JS)@en[[[Error]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[eval]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[EvalError]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[Function]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[Infinity]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[isFinite]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[isNaN]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[Math]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[NaN]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[Number]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[Object]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[parseFloat]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[parseInt]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[RangeError]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[ReferenceError]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[RegExp]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[String]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[SyntaxError]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[TypeError]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[undefined]]]],[[ECMA]] [[標準]],[[ES3]]
,[CODE(JS)@en[[[unescape]]]],[[ECMA]] [[標準]] ([[参考]]),[[ES3]] ([[参考]])
,[CODE(JS)@en[[[URIError]]]],[[ECMA]] [[標準]],[[ES3]]
** Web IDL によって大域オブジェクトに定義されるもの
[65] 次のものが [[Web IDL]] の規定と [[IDL素片]]の定義に基づき[[大域オブジェクト]]上に定義されます。
[FIG(list members)[
:[[インターフェイスオブジェクト]]群:[CODE(IDL)@en[[[interface]]]] により定義された[[インターフェイス]]ごとのオブジェクトが定義されることがあります。
:[[名前付きコンストラクター]]群:
[CODE(IDL)@en[[[NamedConstructor]]]] [[拡張属性]]により[[名前付き構築子]]が定義されることがあります。
:[[辞書コンストラクター]]群:[CODE(IDL)@en[[[dictionary]]]] の [CODE(DOMi)@en[[[Constructor]]]]
[[拡張属性]]により[[構築子]]が定義されることがあります。
:[CODE(DOMi)@en[[[DOMException]]]]:[[[CODE(DOMi)@en[DOMException]]構築子オブジェクト]]です。
常に定義されます。
]FIG]
;; [80] [[例外インターフェイスオブジェクト]]は[[廃止]]されました。
* 演算
[34] [[大域オブジェクト]]は[[エラーの報告]]の[[対象]]として使われます。
[77] [[Web IDL]] の規定する[[アルゴリズム]]は[DFN[[RUBYB[セキュリティー検査を実行]@en[perform a security check]]]]することを求めることがあります。
これは、[[演算]]の実行や [[IDL属性]]へのアクセスが認められるべきかどうかを決めるものです。
[SRC[>>76]]
[78] 本検査への入力は、[[文脈オブジェクト]]たる[[プラットフォームオブジェクト]]と、
[[演算]]や[[IDL属性]]を[[実装]]する [CODE(JS)@en[[[Function]]]] [[オブジェクト]]に関連付けられた
[[JavaScript大域環境]]です [SRC[>>76]]。 出力は、認められるため何もしないか、
認められないため[[例外]]を投げるかです。
;; [79] [[HTML Standard]] で検査が規定されることを [[Web IDL]] は想定しています [SRC[>>76]]
が、現時点では何の規定もありません。
* 大域オブジェクトと環境設定群オブジェクト
[11] [[スクリプト]]は[[設定群オブジェクト]]を持ちますが、
その[[環境設定群オブジェクト]]は[DFN[[RUBYB[[[大域オブジェクト]]]@en[global object]]]]を持ちます。
[[大域オブジェクト]]は、当該[[設定群オブジェクト]]を使う[[スクリプト]]が呼び出せる [[API]]
を提供する[[オブジェクト]]です。 [SRC[>>10]]
;; [12] これは特に [[JavaScript]] に限定せずに定義されています。ただし [[JavaScript]]
以外で利用する方法はどの仕様書でも規定されていません。
;; [29] 空の[[オブジェクト]]を[[大域オブジェクト]]とすると、環境に対して作用できないようになります。 [SRC[>>10]]
[32] [[環境設定群オブジェクト]]と[[大域オブジェクト]]は一対一対応関係にあります。
[[大域オブジェクト]]から見て[[環境設定群オブジェクト]]のことを[[大域オブジェクトの関連する設定群オブジェクト]]といいます。
[SRC[>>10]]
;; [33] 言い換えると、同じ[[大域オブジェクト]]で実行される[[スクリプト]]達は[[環境設定群オブジェクト]]を共有していることになります。
定義上は[[スクリプト]]が[[かんきょう設定群オブジェクト]]を持つという関係になっていますが、
[[スクリプト]]が[[大域オブジェクト]]を持ち、[[大域オブジェクト]]が[[環境設定群オブジェクト]]の諸設定を持っていると解釈・実装することも可能です。
;; [14] [[大域オブジェクト]]と[[スクリプト設定群オブジェクト]]が別のオブジェクトとして定義されているのは、
[[スクリプト無効]]時に[[大域オブジェクト]]が存在しない [SRC[>>13]] ためのようです。
(実際の [[Webブラウザー]]では、[[スクリプト]]から到達できないだけで内部的に[[大域オブジェクト]]は存在しているかもしれませんが。)
[REFS[
- [13] [CITE@en[Bug 28375 – The global object has an origin in implementations, we should acknowledge this. Specifications also routinely assume it has one, e.g. IDB.]] ([TIME[2015-04-21 12:39:14 +09:00]] 版) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=28375#c11>
]REFS]
* 複数の大域オブジェクト
[37] [[文書環境]]では、[[スクリプト]]は他の[[閲覧文脈]]の [CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]にアクセスできます。
これを通じて現在の[[大域オブジェクト]]とは異なる[[大域オブジェクト]]/[[大域環境]]に由来する[[オブジェクト]]にアクセスすることが可能です。
[EG[
[38] 例えば [CODE(HTMLe)@en[[[iframe]]]] 内の[[文書]]が作成した [[JavaScript]] [CODE(DOMi)@en[[[Array]]]]
にアクセスすることができます。その [CODE(DOMi)@en[[[Array]]]] [[オブジェクト]]は、
本[[大域オブジェクト]]の [CODE(DOMi)@en[[[Array]]]] [[プロトタイプ]]の[[実現値]]ではありません。
]EG]
[40] [[ワーカー環境]]では他の[[大域オブジェクト]] (やそこに属する[[オブジェクト]])
にアクセスする方法がありません。
[41] [CODE(DOMm)@en[[[postMessage]]]] は、そのメソッドを呼び出した[[大域環境]]とは異なる[[大域オブジェクト]]に属する[[オブジェクト]]を作成することになります。
[39] [CODE(JS)@en[[[document.open]]]] も [CODE(DOMi)@en[[[Window]]]]
([[大域オブジェクト]]) を差し替えるので、やはり異なる[[大域環境]]の[[オブジェクト]]が混在し得る状況となります。
[42] 実行中の[[大域環境]]の[[文書]]の [CODE(JS)@en[[[document.open]]]] は当該[[文書]]の
[CODE(DOMi)@en[[[Window]]]] と[[環境設定群オブジェクト]]を差し替えますが、
実行中のコード ([CODE(DOMm)@en[[[open]]]] メソッドの呼び出し元) で現に使用している[[設定群オブジェクト]]・[[大域環境]]はそのままなので、
その実行が終わるまでは不思議なことが起こるかもしれません。
* 歴史
[REFS[
- [15] [CITE@en[Web Applications 1.0 r2529 MAJOR CHANGES: Revamp the way scripts are specified, along with their interaction with resolving relative URLs, etc. Give enough detail to justify objects in the DOM not being garbage collected randomly when still in use. Define script groups, to handle scripts going away during document.open() and session history navigation. Define why and how setTimeout(), database transactions, etc, handle page transitions. Drop the terms 'with' and 'without' script, use script is 'enabled'/'disabled' instead. Define 'unload' and 'beforeunload'. Rework how onfoo=[SPAN[']][SPAN[']] and .onfoo event handler attributes are defined. Rework how the content model of <noscript> is defined. Reword the way javascript: is defined to use the new terminology. Add a few notes of things that came up while I was doing all that.]] ([TIME[2008-12-12 17:46:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2528&to=2529>
- [16] [CITE@en[Web Applications 1.0 r7226 Upgrade Web IDL terminology.]]
( ([TIME[2012-08-09 09:21:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7225&to=7226>
]REFS]
[17] >>15 までは[RUBYB[[[スクリプト実行環境]]]@en[script execution environment]]なる概念があり、 >>18 とは別に
[CODE(URI)@en[[[javascript:]]]] [[URL]] の実行時に空のオブジェクトを[[スクリプト実行環境]]とするケースがありました。
[1]
[CITE[Bug 5850 – JS global object]] ([TIME[2008-07-18 18:05:21 +09:00]] 版) <http://www.w3.org/Bugs/Public/show_bug.cgi?id=5850>
[5] [CITE[IRC logs: freenode / #whatwg / 20091202]]
([TIME[2009-12-27 16:37:15 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20091202>
[6] [CITE[John Resig - Re-Securing JSON]]
( ([TIME[2011-07-03 20:25:24 +09:00]] 版))
<http://ejohn.org/blog/re-securing-json/>
[7] [CITE@en-US[Window Object 1.0]]
( ([TIME[2006-04-08 02:19:28 +09:00]] 版))
<http://www.w3.org/TR/Window/#window-basic-scripting>
[8] [CITE[''''''[''''''whatwg'''''']'''''' '''[''''''['''GetOwnProperty''']'''''']''' for named properties of the Window object]]
( ([TIME[2013-09-06 02:15:40 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-September/040715.html>
[9] [CITE@en-US-x-hixie[HTML Standard]]
( ([TIME[2014-04-03 03:44:44 +09:00]] 版))
<http://www.whatwg.org/specs/web-apps/current-work/#global-object>
[68] [CITE@en[Spec for ''''''[''''''Global'''''']'''''' does not seem to be quite web-compatible, and none of the UAs are really compatible with each other]]
( ([[Boris Zbarsky]] 著, [TIME[2013-12-22 15:31:51 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-script-coord/2013OctDec/0405.html>
[69] [CODE(IDL)@en[[[Global]]]] [[拡張属性]]の値は、2014年7月以降、
複数指定する場合に [CODE[[[(]]]]...[CODE[[[)]]]] で括るように変更されました。
;; 詳しくは [CODE[[[Exposed]]]] を参照してください。
[71] [[一次大域インターフェイス]]は[DFN[[RUBYB[[[一次大域オブジェクト]]]@en[primary global object]]]]とも呼ばれていましたが、
2014年7月に修正されました [SRC[>>72]]。
[REFS[
- [72] [CITE["Primary global object" should be "primary global interface". · 5fe7b16 · heycam/webidl]] ([TIME[2014-08-03 09:15:23 +09:00]] 版) <https://github.com/heycam/webidl/commit/5fe7b169200f41b1200ac310597c919e39019038>
]REFS]
[73] [CITE[The SVG Micro DOM (uDOM)]]
( ([TIME[2006-08-10 09:03:24 +09:00]] 版))
<http://www.w3.org/TR/2006/CR-SVGMobile12-20060810/svgudom.html#global__Global>
[74] [CITE[The SVG Micro DOM (uDOM)]]
( ([TIME[2006-08-10 09:03:24 +09:00]] 版))
<http://www.w3.org/TR/2006/CR-SVGMobile12-20060810/svgudom.html#svg__SVGGlobal>