/
866.txt
448 lines (353 loc) · 26.5 KB
/
866.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
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
[9] [[Web]] における[DFN[[RUBYB[スクリプト]@en[script]]]]は、 [[Webブラウザー]]で実行されるプログラム片です。
[[スクリプト]]には[[古典スクリプト]]と[[モジュールスクリプト]]があります。
* 仕様書
[REFS[
- [11] '''[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/#concept-script>'''
- [22] [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/#jump-to-a-code-entry-point>
- [38] [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/#creating-scripts>
- [49] [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/#killing-scripts>
- [64] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#garbage-collection-and-browsing-contexts>
- [76] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-12-22 10:28:15 +09:00]] 版) <https://html.spec.whatwg.org/#script-corresponding-to-the-running-execution-context>
]REFS]
* 分類
[118] [[スクリプト]]には、[DFN[[RUBYB[[[古典スクリプト]]]@en[classic script]]]]と[[モジュールスクリプト]]があります [SRC[>>11]]。
* 状態
[12] [DFN[[RUBYB[[[スクリプト]]]@en[script]]]] [SRC[>>11]] は、
次の[[状態]]を持ちます。
[FIG(list members)[
:[17] [DFN[[F[[RUBYB[[[設定群オブジェクト]]]@en[settings object]]]]]]:
[[スクリプト設定群オブジェクト]]。
同じ文脈の他の[[スクリプト]]と共有している設定諸々です。 [SRC[>>11]]
[18] [[強い参照]]です [SRC[>>64]]。
[HISTORY[
かつては[DFN[[RUBYB[[[スクリプトの関連する設定群オブジェクト]]]@en[[[relevant settings object for a script]]]]]]とも呼ばれました [SRC[>>11]]。
]HISTORY]
]FIG]
[120] [[古典スクリプト]]は次の[[状態]]をも持ちます。
[FIG(list members)[
:[DFN[[F[[RUBYB[ソーステキスト]@en[source text]]]]]]:
[[JavaScript]] [CODE[[[Script]]]] として[[評価]]されることになる、
実行可能なコードのブロックを含む[[文字列]] [SRC[>>11]]。
:[15] [DFN[[F[[RUBYB[[[エラーミュート]]]@en[muted errors]]]]]]フラグ: 設定されている場合には、
この[[スクリプト]]の[[エラー]]にはエラー情報を提供しません。 [SRC[>>11]]
[16] [[起源]]が異なる[[スクリプト]]についてのエラーから私的な情報が流出する虞があるので、
これを抑制するために使います。 [SRC[>>11]]
:[F[元の[[資源]]の[[絶対URL]]]]: [[エラーの報告]]で使われます。
]FIG]
[122] [[モジュールスクリプト]]は、次の[[状態]]をも持ちます。
[FIG(list members)[
:[F[[[モジュール記録]]]]:
構文解析され、[[評価]]できる状態の[[モジュール]]を表す [[Source Text Module Record]]
[SRC[>>11]]。
:[F[[[基底URL]]]]:
[[モジュール指定子を解決]]する時に使う[[基底URL]]です。
[[外部スクリプト]]では[[スクリプト]]を取得した [[URL]] で、
[[文書]]中の[[スクリプト]]では[[文書基底URL]]です。 [SRC[>>11]]
:[F[[[CORS設定]]]]:
[[輸入されたモジュール]]を [[fetch]] するのに使う [[CORS設定群属性]]の状態です [SRC[>>11]]。
]FIG]
* 生成
[10] [[スクリプト]]は次の方法で生成することができます。
[FIG(list)[
- [[HTML]] [CODE(HTMLe)@en[[[script]]]] [[要素]] ([[create a script]] >>39) [SRC[[[HTML Standard]]]]
- [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]]
- [[イベントハンドラー]] ([[getting the current value of the event handler]]) [SRC[[[HTML Standard]]]]
- [[ワーカー]] ([[run a worker]]) [SRC[[[HTML Standard]]]]
- [CODE(DOMm)@en[[[importScripts]]]] ([[create a script]] >>39, >>69) [SRC[[[HTML Standard]]]]
- [CODE(URI)@en[[[javascript:]]]] [[URL]] ([[create a script]] >>39) [SRC[[[HTML Standard]]]]
- [CODE(DOMm)@en[[[setTimeout]]]]/[CODE(DOMm)@en[[[setInterval]]]] への[[文字列]]引数 ([[create a script]] >>39) [SRC[[[HTML Standard]]]]
]FIG]
;; [69] [CODE(DOMm)@en[[[importScripts]]]] は実際には[[スクリプトの作成]]を呼ばないと思われます。
[CODE(DOMm)@en[[[importScripts]]]] の項を参照。
[HISTORY[
[40] 仕様書が存在しませんが、歴史的には次のものもありました。
[FIG(list)[
- [[XBL1]] ([[Gecko]] のみ)
- [[XUL]] ([[Gecko]] のみ)
- [[HTC]] ([[IE]] のみ)
- [CODE(CSS)@en[[[expression()]]]] ([[IE]] のみ)
]FIG]
]HISTORY]
[66] この他に、[[ブラウザー拡張]]や [[WebDriver]] などによって[[スクリプト]]が注入されることもあり得ます。
(それがここでいう[[スクリプト]]なのかどうかは謎です。それぞれの[[アーキテクチャ]]次第で動作が異なるかもしれません。)
;; [65] [CODE(JS)@en[[[eval]]]] や[[文字列]]引数の [CODE(JS)@en[[[Function]]]] は、
ここでいう[[スクリプト]]を作るものではありません。
;; [67] [[Webブラウザー]]が実行する[[スクリプト]]であっても、
ここでいう[[スクリプト]]とは処理方法が異なるものもあります。
例えば [[PAC]] の [[JavaScript]] はまったく異なる方法と環境で実行されます。
[124] [DFN[[RUBYB[古典スクリプトの作成]@en[create a classic script]]]]は、
[VAR[スクリプトソース]]、
[VAR[[[環境設定群オブジェクト]]]]、
[VAR[[[エラーミュートフラグ]]]]について次のようにしなければ[['''なりません''']] [SRC[>>38]]。
[FIG(steps)[
= [130] [VAR[環境設定群オブジェクト]]の[F[[[有責閲覧文脈]]]]について[F[[[スクリプトが無効]]]]なら、
== [131] [VAR[ソーステキスト]]を、[[空文字列]]に設定します。
= [132] それ以外なら、
== [133] [VAR[ソーステキスト]]を、[VAR[スクリプトソース]]に設定します。
= [126] 新しい[[スクリプト]]を返します。
[FIG(list members)[
[FIGCAPTION[
[[スクリプト]]
]FIGCAPTION]
: [F[[[設定群オブジェクト]]]] : [VAR[環境設定群オブジェクト]]
: [F[[[ソーステキスト]]]] : [VAR[ソーステキスト]]
: [F[[[エラーミュートフラグ]]]] : [VAR[エラーミュートフラグ]]
]FIG]
]FIG]
[127] [DFN[[RUBYB[モジュールスクリプトの作成]@en[create a module script]]]]は、
[VAR[スクリプトソース]]、
[VAR[[[環境設定群オブジェクト]]]]、
[VAR[スクリプト基底URL]]、
[VAR[[[CORS設定群属性]]状態]]について次のようにしなければ[['''なりません''']] [SRC[>>38]]。
[FIG(steps)[
= [138] [VAR[realm]] を、[VAR[環境設定群オブジェクト]]の [F[[[Realm]]]] に設定します。
= [134] [VAR[環境設定群オブジェクト]]の[F[[[有責閲覧文脈]]]]について[F[[[スクリプトが無効]]]]なら、
== [135] [VAR[ソーステキスト]]を、[[空文字列]]に設定します。
= [136] それ以外なら、
== [137] [VAR[ソーステキスト]]を、[VAR[スクリプトソース]]に設定します。
= [129] [VAR[スクリプト]]を、新しい[[モジュールスクリプト]]に設定します。
[FIG(list members)[
[FIGCAPTION[
[[モジュールスクリプト]]
]FIGCAPTION]
: [F[[[設定群オブジェクト]]]] : [VAR[環境設定群オブジェクト]]
]FIG]
= [139] [VAR[結果]]を、 [CODE[[[ParseModule]]([VAR[ソーステキスト]], [VAR[realm]], [VAR[スクリプト]])]] に設定します。
= [140] [VAR[結果]]が[[誤り]]の [[List]] なら、
== [141] [VAR[スクリプト]]に関して、[VAR[結果]]の最初の要素で与えられる[[例外を報告]]します。
== [142] [[null]] を返します。
= [143] それ以外なら、
== [144] [VAR[スクリプト]]の[F[[[モジュール記録]]]]を、[VAR[結果]]に設定します。
== [145] [VAR[スクリプト]]の[F[[[基底URL]]]]を、[VAR[スクリプト基底URL]]に設定します。
== [146] [VAR[スクリプト]]の[F[[[CORS設定]]]]を、[VAR[CORS設定群属性状態]]に設定します。
== [147] [VAR[スクリプト]]を返します。
]FIG]
* 実行
[23] [DFN[[RUBYB[古典スクリプトの実行]@en[run a classic script]]]] [SRC[>>22]]
(旧[DFN[[RUBYB[[[コード入口点に飛ぶ]]]@en[jump to a code entry-point]]]])
は、次の[[引数]]を持つ手続きです。
[FIG(list members)[
: [VAR[スクリプト]] : [[スクリプト]]
: [VAR[[RUBYB[エラーを再度投げる]@en[rethrow errors]]]]フラグ :
]FIG]
[45] 次のようにしなければ[['''なりません''']] [SRC[>>22]]。
[FIG(steps)[
= [78] [VAR[設定群オブジェクト]]を、[VAR[スクリプト]]の[F[[[設定群オブジェクト]]]]に設定します。
= [24] [VAR[結果]]を、[VAR[設定群オブジェクト]]について[[コールバックを走らせる準備]]をした結果に設定します。
= [80] [VAR[結果]]が「走らせない」なら、ここで停止します。
= [25] [VAR[結果]]を、 [CODE[[[ParseScript]]([VAR[スクリプト]]の[F[[[コード入口点]]]], [VAR[スクリプト]])]] の結果に設定します。
= [82] [VAR[結果]]が[[エラー]]の [[List]] なら、
== [48] [VAR[エラーを再度投げる]]フラグが設定されているなら、
=== [107] [VAR[スクリプト]]の[F[[[エラーミュート]]]]フラグが設定されていれば、
==== [108] [CODE(DOMe)@en[[[NetworkError]]]] [[例外]]を[[投げ]]ます。
=== [106] それ以外なら、
==== [56] [VAR[結果]]の最初の要素のエラーを[[投げ]]ます。
==- [110] いずれにせよ、次 (>>26) に進みます。
== [109] それ以外なら、
=== [83] [VAR[結果]]の最初の要素について、[VAR[スクリプト]]の[[例外を報告]]します。
= [87] それ以外なら、
== [84] [VAR[状態]]を、 [CODE[[[ScriptEvaluation]]([VAR[結果]])]] の結果に設定します。
== [85] [VAR[状態]]が [[abrupt completion]] なら、
=== [86] [CODE[[VAR[結果]].[F(ss)[[[value]]]]]] について、[VAR[スクリプト]]の[[例外を報告]]します。
= [26] [VAR[設定群オブジェクト]]について[[コールバックを走らせた後の片付け]]をします。
= [81] [VAR[結果]]が存在し、 [[abrupt completion]] 以外なら、
== [111] [VAR[エラーを再度投げる]]フラグが設定されていれば、
=== [112] [VAR[エラーミュート]]フラグが設定されていれば、
==== [115] [CODE(DOMe)@en[[[NetworkError]]]] [[例外]]を[[投げ]]ます。
=== [113] それ以外なら、
==== [114] [CODE[[VAR[結果]].[F(ss)[value]]]] のエラーを[[投げ]]ます。
== [116] それ以外なら、
=== [88] [CODE[[VAR[結果]].[F(ss)[value]]]] を返します。
= [89] それ以外なら、
== [90] 次のいずれかによりスクリプト実行は成功しなかったとします。
==- [91] [[構文解析]]中の[[エラー]]
==- [92] [[評価]]中の[[例外]]
==- [93] [[aborted prematurely]]
]FIG]
;; [79] [[スクリプト]]の[F[[[コード入口点]]]]は[[文字列]]または[[関数]]ですが、
[[関数]]の時この手順は使えません。
[94] [[環境設定群オブジェクト]][VAR[設定群オブジェクト]]について[DFN[[RUBYB[[[コールバックを走らせる準備]]]@en[prepare to run a callback]]]]は、
次のようにします [SRC[>>22]]。
[FIG(steps)[
= [27] [VAR[設定群オブジェクト]]の[F[[[大域オブジェクト]]]]が [CODE(DOMi)@en[[[Window]]]]
でその [F[[CODE(DOMi)@en[[[Document]]]]]] が[F[[[完全に活性]]]]でないなら、
== [99] 「[RUBYB[走らせない]@en[do not run]]」を返します。
= [28] それ以外で、[VAR[設定群オブジェクト]]の[F[[[有責閲覧文脈]]]]で[F[[[スクリプトが無効]]]]なら、
== [100] 「走らせない」を返します。
= [29] それ以外なら、
== [96] [VAR[設定群オブジェクト]]の[F[[[候補入口設定群オブジェクト]]]]フラグを設定します。
== [97] [[JavaScript実行文脈スタック]]に[VAR[設定群オブジェクト]]の[F[[[realm実行文脈]]]]を[[積み]]ます。
(新たな[[走っているJavaScript実行文脈]]となります。)
== [98] 「[RUBYB[走らせる]@en[run]]」を返します。
]FIG]
[95] [[環境設定群オブジェクト]][VAR[設定群オブジェクト]]について[DFN[[RUBYB[[[コールバックを走らせた後の片付け]]]@en[clean up after running a callback]]]]は、
次のようにします [SRC[>>22]]。
[FIG(steps)[
= [101] [VAR[設定群オブジェクト]]の[F[[[候補入口設定群オブジェクト]]]]フラグを落とします。
= [30] [VAR[設定群オブジェクト]]の[F[[[realm実行文脈]]]]を[[JavaScript実行文脈スタック]]から削除します。
= [31] [[JavaScript実行文脈スタック]]が空なら、
== [102] [[大域スクリプト片付けジョブを走らせます]]。
=- [33] ここでは[[スクリプト]]は走りません。
= [32] [[JavaScript実行文脈スタック]]が空なら、
== [103] [[マイクロタスクチェックポイント]]を行います。
=- [34] ここでは[[スクリプト]]が再帰的に走らせられることがあります。
]FIG]
;; [71] [[コールバックを走らせる準備]]と[[コールバックを走らせた後の片付け]]は、
[CODE[[[EnqueueJob]]]] による[[マイクロタスク]]でも呼び出されます。
[HISTORY[
[104] [[JavaScript実行文脈スタック]]と[[スクリプト設定群オブジェクトのスタック]]が統合される前は、次のように規定されていました。
[35] [[JavaScript]] の [CODE(JS)[[[SourceElements]]]] が評価される時には、
それに対応する[[スクリプト]]の[[設定群オブジェクト]]を評価の直前に[[スクリプト設定群オブジェクトのスタック]]に
[[push]] し、直後に [[pop]] しなければ[['''なりません''']] [SRC[>>22]]。
[37] [[ES5]] では [CODE(JS)@en[[[SourceElements]]]] は[[プログラム]]の全体と、[[関数]]の中身で使われています。
[[ES6]] では [CODE(JS)@en[[[SourceElements]]]] がなくなってしまっています。 [TIME[2014-04-15T04:21:08.00Z]]
;; [36] [[コールバック関数の呼び出し]]と似ていますが、いくつか違いがあります。
[55] >>25 では[[実行時エラー]]が発生したり、[[例外]]が [[catch]] されなかったりすることがあります。
この場合の挙動は[[エラーの報告]]の項をご覧ください。
]HISTORY]
[77] [DFN[[RUBYB[走っている実行文脈に対応するスクリプト]@en[script corresponding to the running execution context]]]]は、
[[走っているJavaScript実行文脈]]の [F[[CODE[[[ScriptOrModule]]]]]]
の [CODE[[F(ss)[[[HostDefined]]]]]] の[[スクリプト]]です。 [SRC[>>76]]
* 実行制限と中断
[51] [[閲覧文脈]]は[[スクリプトが有効]]、[[スクリプトが無効]]の状態を有しており、
[[利用者エージェント]]の対応状況、[[利用者]]の設定、[[著者]]の指定によってどちらであるかが決定します。
[[スクリプトが無効]]の場合、[[スクリプト]]が作成されなかったり、[[スクリプト]]の実行が実際の内容に関わらず
「何もしない」となったり (>>28) します。詳しくは[[スクリプトが無効]]の項をご覧ください。
[54] [[スクリプト]]の実行中に[[スクリプト]]が無効になったときは、ただちに[[スクリプト]]を終端する[['''べきです''']]
[SRC[>>49]]。
[52] [[利用者エージェント]]は、[[スクリプト]]に対して[[資源]]の制限を課して[['''構いません''']]。
例えば、[[CPU]] [[quota]]、[[メモリー]]の制限、合計実行時間の制限、[[帯域]]の制限などを課すことができます。 [SRC[>>49]]
[53] [[スクリプト]]が制限を超えた時は、 [CODE(DOMc)@en[[[QuotaExceededError]]]] [[例外]]を[[投げる]]か、
[[例外]]なしで中断するか、[[利用者]]に確認するか、[[スクリプト]]の実行に[RUBYB[[[絞り弁]]]@en[throttele]]を適用するかして[['''構いません''']]。
[SRC[>>49]]
;; [63] [[ハードウェア等の制約に関する条項]]も参照。
[68] [[ワーカー]]では、[[ワーカーを殺す]]操作や[[ワーカーの停止]]操作により、
[[スクリプト]]の実行が中断されることがあります。
* ごみ収集
[20] [[スクリプト]]は、[[イベントハンドラー]]として用いられるものを除けば >>10 のいずれもその場で作られ、
実行され、[[スクリプト]]への参照は残らないので、実行が終わり次第[[ごみ収集]]されることになります。
[21] [[イベントハンドラー]]については作られた後何度も実行され得るので、他の[[イベントハンドラー]]に置き換えられるなり、
[CODE(DOMi)@en[[[EventTarget]]]] もろとも[[ごみ収集]]されるなりするまで、[[ごみ収集]]されずに残ることになります。
* マーク付けの適合性との関係
@@ 本項は古くなっています。
[5]
[[HTML文書]]は、 [CODE(HTMLe)@en[[[script]]]]
の処理の前後いずれにおいても、 [[HTML]] [[DTD]]
に[[適合]]しなければなりません。 [SRC@en[HTML4 18.2.4]]
[4] 仕様書:
- [[HTML 4]]
-- [CSECTION@en[18.2.4 Dynamic modification of documents]]
<IW:HTML4:"interact/scripts.html#idx-document">
[6]
[[HTML 4]] の >>5 の規定は[[スクリプト]]が生成する [[HTML]]
[[文書片]]の[[適合性]]に関する議論でしばしば引用されますが、
時期や内容からしても、 [[HTML 4]] はおそらく [[HTML]]
[[文書]]全体にアクセス可能な現在の [[DOM]] を想定していません。
現実の [[Webブラウザ]]の処理モデルとも一致していませんし、
それほど価値がある引用だとは思えません。
* 並行性・並列性
[57] [[著者]]から観測可能な範囲において、複数の[[スクリプト]]が同時に実行される(ように見える)ことはありません。
[[スクリプト]]の[[著者]]は、[[マルチスレッド]]のプログラミングのように複雑な[[排他制御]]などを考える必要はありません。
;; [58] [CODE(DOMm)@en[[[showModalDialog]]]] のように[[タスク]]が途中で中断され、
後に再開される場合など、特殊な場合において[[スクリプト]]が複数同時に動作するように思えることがありますが、
ある時点で処理を進められる状態にある[[スクリプト]]は必ず1つだけです。
;; [59] [[ワーカー]]や異なる[[起源]]の[[スクリプト]]など、 [CODE(DOMm)@en[[[postMessage]]]]
などによってのみ情報伝達が可能な[[スクリプト]]同士は、複数同時に動作している可能性がありますが、
本当に複数同時に実行されているのか、順番に実行されているのか直接的に知る方法はありませんし、
互いのデータに直接的にアクセスする手段もありません。
[60] 詳しくは[[イベントループ]]の項を参照してください。
* 歴史
** HTML4
[3] ([[HTML]] の) [[クライアント]]側[DFN[[RUBYB[スクリプト][script]]]]とは、
HTML 文書に添えられた、あるいは HTML 文書中に埋込まれた[[プログラム]]です。
このプログラムは文書が読込まれた時、あるいは[[連結]]が[[活性化]]された時などに、
クライアントの機械上で実行されます。
[REFS[
- [125] [[HTML 4]] [CITE[18.1 Introduction to scripts]]
<http://www.w3.org/TR/html4/interact/scripts.html#idx-script> より
]REFS]
[128] [[HTML4]] 時代には、[[スクリプト]]を [[HTML]] に埋め込む方法は定義されましたが、
その具体的な処理方法は明確にされないままでした。 [[W3C]]
は以後数年間にわたってこの状態を放置してきました。
[1] ''DynamicScripting'' <http://www.interq.or.jp/student/exeal/dss/> [[JavaScript]] 系, [[VBScript]], [[DOM]], [[WSH]] などについて。著者は mozilla.gr.jp の和訳プロジェクトに参加している人だそうです。 [[W3C]] などの仕様もちゃんと参照していますし、内容は信頼できます。
** HTML5
[148] [[HTML5]] は歴史上初めて[[スクリプト]]の詳細な処理モデルを明文化しました。
更に [CODE(HTMLe)@en[[[script]]]] [[要素]]の [CODE(HTMLa)@en[[[async]]]]
[[属性]]や[[ワーカー]]などの新機能を導入しました。
[7] [CITE[Code defined for one document called after that document is no longer the one being displayed]] ([[Ian Hickson <ian@...>]] 著, [TIME[2008-12-23 03:41:08 +09:00]] 版) <http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/17268>
[8] [CITE[IRC logs: freenode / #whatwg / 20090325]] ([TIME[2009-05-16 17:57:49 +09:00]] 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20090325>
[[SVG]] における[[スクリプト]]実行モデル (と [[HTML]] の[[スクリプト]]実行モデル) に関する議論です。
[61] [CITE[The "initialization" steps for Web browsers]]
( ([TIME[2014-07-22 08:29:04 +09:00]] 版))
<https://mail.mozilla.org/pipermail/es-discuss/2014-July/038399.html>
[62] >>2 で[[スクリプト]]の[[スクリプト設定群オブジェクト]]は[[環境設定群オブジェクト]]に改称されています。
;; [[環境設定群オブジェクト]]も参照。
[REFS[
- [2] [CITE@en[Web Applications 1.0 r8834 Rename script settings objects to environment settings objects to make reuse saner.]] ([TIME[2014-10-11 08:43:00 +09:00]] 版) <https://html5.org/r/8834>
]REFS]
[119] 2016年1月の[[モジュール]]導入までは、[[古典スクリプト]]が[[スクリプト]]と呼ばれていました
[SRC[>>117]]。
*** コード入口点
[121] [[古典スクリプト]]の[F[[[ソーステキスト]]]]は、
当時は[[スクリプト]]の[F[[[コード入口点]]]]として定義されていました。
[13] [[スクリプト]]の[F[[DFN[[RUBYB[[[コード入口点]]]@en[code entry-point]]]]]]は、
[[実行可能コード]]の[[ブロック]]を含むものとして[[評価]]されることとなる[[文字列]]、
または [[JavaScript関数オブジェクト]]のいずれかです。 [SRC[>>11]]
[HISTORY[
[72] かつては次のように一般的に規定されていましたが、 [[JavaScript]]
以外の[[言語]]への対応は削除されました。
>
[73] [[スクリプト]]が他の[[スクリプト]]や[[利用者エージェント]]に晒す、
[[実行可能コード]]の[[ブロック]]。一般的には[[コード入口点]]に対応する[[コード]]は[[スクリプト]]が[[構文解析]]された直後に実行されますが、
[[イベントハンドラー]]の場合は呼び出される度に実行されます。
>
[14] [[JavaScript]] の [CODE(HTMLe)@en[[[script]]]] [[ブロック]]の場合には、[[大域コード]]の[[実行文脈]]に対応します。
]HISTORY]
[74] [[コード入口点]]は、[[イベントハンドラー]]の場合[[関数]]のこともありますが、
多くの場合は[[文字列]]です。[[文字列]]を [[JavaScript]] として[[評価]]した結果、
正しい [[JavaScript]] の[[スクリプト]]であることもあれば、
[[構文エラー]]などが含まれる場合もあります。
[19] [[コード入口点]]は、実行すると値を返したり、[[例外]]を投げたりします。
返された値は、呼び出し元で使われることがあります。
[[例外]]は、呼び出し元で適宜処理されます。
*** スクリプトの作成
[123] [[モジュール]]導入以前は、[[古典スクリプトの作成]]と実行に相当するのは[[スクリプトの作成]]という手順でした。
[39] [DFN[[RUBYB[[[スクリプトの作成]]]@en[create a script]]]] [SRC[>>38]]は、
[[ワーカー]]と[[イベントハンドラー]]を除く[[スクリプト]]を作り、実行する時に呼ばれる手順です。
次の[[引数]]があります。
[FIG(list members)[
: [VAR[スクリプトのソース]] : [[スクリプト]]の[[ソースコード]]として使われる[[文字列]]。
: [VAR[スクリプトのソースの [[URL]]]] :
: [VAR[環境設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[[RUBYB[エラーミュート]@en[muted errors]]]]フラグ :
: [VAR[[RUBYB[エラーを再度投げる]@en[rethrow errors]]]]フラグ :
: [VAR[閲覧文脈]] :
]FIG]
[105] 次のようにしなければ[['''なりません''']] [SRC[>>38]]。
[FIG(steps)[
= [41] [VAR[閲覧文脈]]で[F[[[スクリプトが無効]]]]なら、ここで停止します。
= [46] [VAR[スクリプト]]を、新しい[[スクリプト]]に設定します。
[FIG(list members)[
[FIGCAPTION[
[[スクリプト]]
]FIGCAPTION]
:[47] [F[[[コード入口点]]]] : [VAR[スクリプトのソース]]
:[44] [F[[[設定群オブジェクト]]]]: [VAR[環境設定群オブジェクト]]
:[F[[[エラーミュートフラグ]]]] : [VAR[エラーミュート]]フラグ
]FIG]
= [42] [VAR[スクリプト]]の[[コード入口点に飛ぶ]]処理を実行します。
[VAR[エラーを再度投げる]]フラグを引き継ぎます。
]FIG]
;; [50] 「作成」という手順ですが、実行も含まれています。
** HTML 2016
[149] 2015年後半から2016年にかけて、[[スクリプト]]に関する規定の整理と[[モジュール]]の導入などの大改訂が行われています。
[70] [CITE@en[Add promise rejection tracking events · whatwg/html@61ccc05]] ([TIME[2015-12-03 23:31:26 +09:00]] 版) <https://github.com/whatwg/html/commit/61ccc05b7437ba947390928f9e526da49550fed0>
[75] [CITE@en[Rewrite script execution on top of ES · whatwg/html@4891d18]]
([TIME[2015-12-22 20:47:43 +09:00]] 版)
<https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>
[43] [CITE@en[Fix importScripts() script execution · whatwg/html@704907d]]
([TIME[2015-12-23 23:21:35 +09:00]] 版)
<https://github.com/whatwg/html/commit/704907dc195e77759fb7b48e51932094d150b7fc>
[117] [CITE@en[Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb]]
([TIME[2016-01-21 22:53:08 +09:00]] 版)
<https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4>