/
336.txt
266 lines (203 loc) · 16.6 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
* 仕様書
[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>
- [36] [CITE[Web IDL (Second Edition)]] ([TIME[2014-02-10 21:45:38 +09:00]] 版) <http://heycam.github.io/webidl/#Global>
- [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]]。
* スクリプト設定群オブジェクト
[11] [[スクリプト]]は[[スクリプト設定群オブジェクト]]を持ちますが、
[[スクリプト設定群オブジェクト]]は[DFN[[RUBYB[[[大域オブジェクト]]]@en[global object]]]]を持ちます。
[[大域オブジェクト]]は、当該[[設定群オブジェクト]]を使う[[スクリプト]]が呼び出せる [[API]]
を提供する[[オブジェクト]]です。 [SRC[>>10]]
;; [12] これは特に [[JavaScript]] に限定せずに定義されています。ただし [[JavaScript]]
以外で利用する方法はどの仕様書でも規定されていません。
;; [29] 空の[[オブジェクト]]を[[大域オブジェクト]]とすると、環境に対して作用できないようになります。 [SRC[>>10]]
[32] [[スクリプト設定群オブジェクト]]と[[大域オブジェクト]]は一対一対応関係にあります。
[[大域オブジェクト]]から見て[[スクリプト設定群オブジェクト]]のことを[[大域オブジェクトの関連する設定群オブジェクト]]といいます。
[SRC[>>10]]
;; [33] 言い換えると、同じ[[大域オブジェクト]]で実行される[[スクリプト]]達は[[スクリプト設定群オブジェクト]]を共有していることになります。
定義上は[[スクリプト]]が[[スクリプト設定群オブジェクト]]を持つという関係になっていますが、
[[スクリプト]]が[[大域オブジェクト]]を持ち、[[大域オブジェクト]]が[[スクリプト設定群オブジェクト]]の諸設定を持っていると解釈・実装することも可能です。
* 分類
[22] [[JavaScript大域環境]]には次の3種類があります [SRC[>>23]]。それぞれ異なる種類の[[大域オブジェクト]]を用いています。
[FIG[
- [18] [RUBYB[[[文書環境]]]@en[document environment]] ([[大域オブジェクト]]: [CODE(DOMi)@en[[[Window]]]])
- [19] [RUBYB[[[ワーカー環境]]]@en[worker environment]] ([[大域オブジェクト]]: [CODE(DOMi)@en[[[Worker]]]])
-- [20] [RUBYB[[[専用ワーカー環境]]]@en[dedicated worker environment]] ([[大域オブジェクト]]: [CODE(DOMi)@en[[[DedicatedWorker]]]])
-- [21] [RUBYB[[[共有ワーカー環境]]]@en[shared worker environment]] ([[大域オブジェクト]]: [CODE(DOMi)@en[[[SharedWorker]]]])
]FIG]
[26] 特記なき場合 [[JavaScript大域環境]]は[[文書環境]]です [SRC[>>23]]。
[27] >>18 の特殊ケースとして、[[大域オブジェクト]]が [CODE(DOMi)@en[[[Window]]]] と [CODE(DOMi)@en[[[WindowModal]]]]
の両方を[[実装]]したオブジェクトとなる [SRC[>>12]] ことがあります。
[28] [[ウィジェット実現値]]では [CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]が [CODE(DOMi)@en[[[WindowWidget]]]]
も[[実装]]することになっています。
* 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]]。
* [CODE(IDL)@en[Global]] 拡張属性、 [CODE(IDL)@en[PrimaryGlobal]] 拡張属性 (Web IDL)
[37] [[Web IDL]] には[[拡張属性]]として [DFN[[CODE(IDL)@en[[[Global]]]]]]、
[DFN[[CODE(IDL)[[[PrimaryGlobal]]]]]] があり、[[インターフェイス]]に指定できます [SRC[>>36]]。
[55] これらの[[拡張属性]]を同時には指定できません [SRC[>>36]]。
[56] [CODE(IDL)@en[[[PrimaryGlobal]]]] [[拡張属性]]を指定できるのは、
いずれか1つの[[インターフェイス]]だけです [SRC[>>36]]。
この[[拡張属性]]が指定されたものを[DFN[[RUBYB[[[一次大域オブジェクト]]]@en[primary global object]]]]といいます
[SRC[>>36]]。
[45] これらの[[拡張属性]]を[[部分インターフェイス定義]]に指定する場合は、
その[[部分インターフェイス定義]]で[[名前付き特性取得子]]も定義していなければ[['''なりません''']]
[SRC[>>36]]。
;; [48] [CODE(IDL)@en[[[partial]]]] でない [CODE(IDL)@en[[[interface]]]]
なら、[[名前付き特性]]が定義されていなくても構わないようです。
** 作用と制約
[38] これらの[[拡張属性]]が指定された[[インターフェイス]]を[[実装]]する[[オブジェクト]]は、
[[ECMAScript環境]]で[[大域オブジェクト]]として使うことができます [SRC[>>36]]。
[46] これらの[[拡張属性]]が指定された[[インターフェイス]]は、
同じ [[ECMAScript大域環境]]においてそれを[[実装]]する[[オブジェクト]]を複数持つことができません
[SRC[>>36]]。これは、[[名前付き特性]]が[[プロトタイプ鎖]]中に現れるため、
複数存在するとすべての[[オブジェクト]]が同じ[[名前付き特性]]群を共有してしまうためです
[SRC[>>36]]。
;; [47] 複数の [CODE(DOMi)@en[[[Window]]]] ([CODE(DOMi)@en[[[WindowProxy]]]])
[[オブジェクト]]が同時に存在することがあるように、
同じ[[インターフェイス]]を[[実装]]していながらも異なる[[ECMAScript大域環境]]由来の[[オブジェクト]]なら複数存在することがあります。
[40] これらの[[拡張属性]]が指定された[[インターフェイス]]を[[実装]]する[[オブジェクト]]では、
当該[[インターフェイス]]や[[派生的インターフェイス群]]の[[インターフェイスメンバー]]は、
[[インターフェイスプロトタイプオブジェクト]]ではなく、
[[オブジェクト]]自体に現れます [SRC[>>36]]。
[52] これらの[[拡張属性]]が指定された[[インターフェイス]]については、
当該[[インターフェイス]]と[[派生的インターフェイス群]]にわたって[[インターフェイスメンバー]]の名前が衝突したり、
[[文字列化器]]、[[直列化器]]、[[反復器]]がそれぞれ複数あったりしては[['''なりません''']]
[SRC[>>36]]。
[39] これらの[[拡張属性]]が指定された[[インターフェイス]]を[[実装]]する[[オブジェクト]]では、
[[名前付き特性]]は、その[[オブジェクト]]自体ではなく、[[プロトタイプ鎖]]中にある[[名前付き特性オブジェクト]]に現れます
[SRC[>>36]]。
[41] これらの[[拡張属性]]が指定された[[インターフェイス]]を[[実装]]する[[オブジェクト]]では、
[[名前付き特性]]の[[設定子]]、[[作成子]]、[[削除子]]を定義しては[['''なりません''']]
[SRC[>>36]]。
[42] これらの[[拡張属性]]が指定された[[インターフェイス]]には、
[CODE(IDL)@en[[[OverrideBuiltins]]]] [[拡張属性]]を指定しては[['''なりません''']]
[SRC[>>36]]。また [CODE(IDL)@en[[[OverrideBuiltins]]]]
[[拡張属性]]が指定された[[インターフェイス]]を[[継承]]しては[['''なりません''']]
[SRC[>>36]]。
;; [43] [CODE(IDL)@en[[[OverrideBuiltins]]]] [[拡張属性]]は[[インターフェイスメンバー]]と[[名前付き特性]]が同じ[[オブジェクト]]に存在していないと使えません。
[44] これらの[[拡張属性]]が指定された[[インターフェイス]]を他の[[インターフェイス]]が[[継承]]することはできません
[SRC[>>36]]。
** 引数
[53] これらの[[拡張属性]]は、[[引数]]なしか、[[識別子リスト]]のいずれかでなければなりません
[SRC[>>36]]。
[54] [[識別子リスト]]があれば、それらの[[識別子]]が[[大域名]]となります。
なければ、[[インターフェイス名]]が[[大域名]]となります。 [SRC[>>36]]
** 実例
[49] [CODE(DOMi)@en[[[Window]]]] が [CODE(IDL)@en[[[PrimaryGlobal]]]]
[[拡張属性]]つきです。
[50] [CODE(DOMi)@en[[[DedicatedWorker]]]] が
[CODE(IDL)@en[[[Global]]=[[Worker]],[[DedicatedWorker]]]] [[拡張属性]]つきです。
[51] [CODE(DOMi)@en[[[SharedWorker]]]] が
[CODE(IDL)@en[[[Global]]=[[Worker]],[[SharedWorker]]]] [[拡張属性]]つきです。
* 大域名
[57] [[大域オブジェクト]]を識別する名前を[DFN[[RUBYB[[[大域名]]]@en[global name]]]]といいます。
[[大域名]]は [CODE(IDL)@en[[[Global]]]] [[拡張属性]]や [CODE(IDL)@en[[[PrimaryGlobal]]]]
[[拡張属性]]に[[識別子リスト]]として指定することができます。
明示されていない場合、[[インターフェイス]]の名前が[[大域名]]となります。
[60] [[大域名]]には制約がなく、複数の[[インターフェイス]]に同じ[[大域名]]を与えることもできます。
[FIG[
[FIGCAPTION[
[63] [[大域名]]の一覧
]FIGCAPTION]
- [58] [[大域名]] [CODE(DOMi)@en[[[Window]]]]
-- [CODE(DOMi)@en[[[Window]]]] [[インターフェイス]]
- [59] [[大域名]] [CODE(DOMi)@en[[[Worker]]]]
-- [CODE(DOMi)@en[[[DedicatedWorker]]]] [[インターフェイス]]
-- [CODE(DOMi)@en[[[SharedWorker]]]] [[インターフェイス]]
- [61] [[大域名]] [CODE(DOMi)@en[[[DedicatedWorker]]]]
-- [CODE(DOMi)@en[[[DedicatedWorker]]]] [[インターフェイス]]
- [62] [[大域名]] [CODE(DOMi)@en[[[SharedWorker]]]]
-- [CODE(DOMi)@en[[[SharedWorker]]]] [[インターフェイス]]
]FIG]
[64] [[大域名]]は [CODE(IDL)@en[[[Exposed]]]] [[拡張属性]]で[[大域オブジェクト]]を指定するために使われます。
* 演算
[34] [[大域オブジェクト]]は[[エラーの報告]]の[[対象]]として使われます。
* 状態
[35] [[エラーの報告]]の[[対象]] (>>34) は[[エラー報告モード]]になることがあります。
** 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]]
* 歴史
[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>