/
866.txt
577 lines (461 loc) · 32.6 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
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
[9] [[Web]] における[DFN[[RUBYB[スクリプト]@en[script]]]]は、 [[Webブラウザー]]で実行されるプログラム片です。
[[スクリプト]]には[[古典スクリプト]]と[[モジュールスクリプト]]があります。
* 仕様書
[REFS[
- [162] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#concept-script-type>
- [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>
- [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>
- [158] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-16 01:30:20 +09:00]] 版) <https://html.spec.whatwg.org/#integration-with-the-javascript-module-system>
- [98] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-14 16:33:19 +09:00]] 版) <https://html.spec.whatwg.org/#concept-workerglobalscope-type>
- [100] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-14 16:33:19 +09:00]] 版) <https://html.spec.whatwg.org/#workeroptions>
- [156] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-14 16:33:19 +09:00]] 版) <https://html.spec.whatwg.org/#workertype>
- [68] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-24 02:49:49 +09:00]] 版) <https://html.spec.whatwg.org/#import-scripts-into-worker-global-scope>
- [164] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-03-27 03:13:07 +09:00]] 版) <https://html.spec.whatwg.org/#running-script>
]REFS]
* 分類
[118] [[スクリプト]]には、[DFN[[RUBYB[[[古典スクリプト]]]@en[classic script]]]]と[[モジュールスクリプト]]があります [SRC[>>11]]。
[159] [[JavaScript]] では両者をそれぞれ[[スクリプト]]と[[モジュール]]と呼んでいます
[SRC[>>158]]。 [[HTML]] の用語 (>>118) は、どちらも [CODE(HTMLe)@en[[[script]]]]
[[要素]]を通じて利用することによります [SRC[>>158]]。
[163] [CODE(HTMLe)@en[[[script]]]] [[要素]]は[DFN[[RUBYB[スクリプトの型]@en[the script's type]]]]を持ちます。
初期状態では未設定です。値は [CODE[[[classic]]]] や [CODE[[[module]]]]
です。 [SRC[>>162]]
;; [CODE(HTML)@en[[[<script type>]]]] も参照。
[99] [CODE(DOMi)@en[[[WorkerGlobalScope]]]] には[F[[RUBYB[[[型][スクリプトの型]]]@en[type]]]]があり、
その値は [CODE[[[classic]]]] か [CODE[[[module]]]] のいずれかです。 [SRC[>>98]]
それぞれ[[古典スクリプト]]と[[モジュールスクリプト]]を表します。
[155] [[ワーカー]]の作成時には、 [CODE(DOMi)@en[[[WorkerOptions]]]] [[辞書]]の
[DFN[[CODE[[[type]]]]]] [SRC[>>100]] の値により、
[[古典スクリプト]]か[[ワーカースクリプト]]のいずれかを指定できます。
値は [DFN[[CODE(DOMi)@en[[[WorkerType]]]]]] [SRC[>>100]]、すなわち
[DFN[[CODE[[[classic]]]]]] か [CODE[[[module]]]] のいずれか [SRC[>>156]] です。
[CODE[[[type]]]] 省略時の既定値は [CODE[[[classic]]]] です [SRC[>>100]]。
[FIG(table col)[
[FIGCAPTION[
[160] [[古典スクリプト]]と[[モジュールスクリプト]]
]FIGCAPTION]
:js: [[JavaScript]] 用語
:html: [[HTML]] 用語
:script: [CODE(HTMLe)@en[[[script]]]] [[要素]]
:script type: [[スクリプトの型]]
:workertype: [CODE(DOMi)@en[[[WorkerType]]]]
:worker: [CODE(DOMi)@en[[[Worker]]]]
:sharedworker: [CODE(DOMi)@en[[[SharedWorker]]]]
:currentScript: [CODE(JS)@en[document.currentScript]]
:html: [[古典スクリプト]]
:script: [CODE(HTML)@en[<[[script]]></[[script]]>]]
:js: [[スクリプト]]
:script type: [CODE[[[classic]]]]
:workertype: [CODE[[[classic]]]]
:worker: [CODE(JS)@en[[[new Worker]] (..., {})]]
:sharedworker: [CODE(JS)@en[[[new SharedWorker]] (..., {})]]
:currentScript: ○
:html: [[モジュールスクリプト]]
:js: [[モジュール]]
:workertype: [CODE[[[module]]]]
:script: [CODE(HTML)@en[<[[script]] [[type]]=[[module]]></[[script]]>]]
:script type: [CODE[[[module]]]]
:worker: [CODE(JS)@en[[[new Worker]] (..., {[[type]]: "[[module]]"})]]
:sharedworker: [CODE(JS)@en[[[new SharedWorker]] (..., {[[type]]: "[[module]]"})]]
:currentScript: ×
]FIG]
* 状態
[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[[[credentials mode]]]]:
[[輸入されたモジュール]]を [[fetch]] するのに使う [[credentials mode]] です [SRC[>>11]]。
: [F[暗号学的nonce]] :
[[モジュールスクリプトのfetch]]の際の [[nonce]] の検査に使う[[文字列]]です。
: [F[構文解析器状態]] :
[[モジュールスクリプトのfetch]]の際の[F[構文解析器メタデータ]]として使う値です。
]FIG]
[161] [[スクリプト]]は、次のような一連の処理によって実行されます。
[FIG(steps)[
= [CODE(HTMLe)@en[[[script]]]] [[要素の挿入]]または[[ワーカー]][[構築子]]の呼び出し
= [[fetch]] ([[外部スクリプト]]の場合)
= 作成
= 実行
]FIG]
* fetch
[157] [[スクリプトのfetch]]も参照。
* 生成
[10] [[スクリプト]]は次の方法で生成することができます。
[FIG(list)[
- [[HTML]] [CODE(HTMLe)@en[[[script]]]] [[要素]] ([[create a script]] >>39) [SRC[[[HTML Standard]]]]
- [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]]
- [[ワーカー]] ([[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[
[27] [[イベントハンドラー]] ([[getting the current value of the event handler]]) [SRC[[[HTML Standard]]]]
も以前は[[スクリプト]]を使っていましたが、現在は[[スクリプト]]ではなく、
単なる [[JavaScript]] の [CODE(JS)@en[[[Function]]]] として定義されています。
[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[[[credentials mode]]]]、
[VAR[[[暗号学的nonce]]]]、
[VAR[構文解析器状態]]について次のようにしなければ[['''なりません''']] [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[スクリプト]]に次の通り設定します。
[FIG(list members)[
: [F[モジュール記録]] : [VAR[結果]]
: [F[基底URL]] : [VAR[スクリプト基底URL]]
: [F[credentialsモード]] : [VAR[credentials mode]]
: [F[暗号学的nonce]] : [VAR[暗号学的nonce]]
: [F[構文解析器状態]] : [VAR[構文解析器状態]]
]FIG]
== [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]]]]フラグ :
[[例外]]が投げられた時に、それを呼び出し元の[[スクリプト]]に伝播させるべきかどうかを指定します。
基本的には[[偽]]で、[[例外]]は[[例外の報告]]へと回されますが、
[CODE(DOMm)@en[[[importScripts]]]] では呼び出し元に引き渡されます。
]FIG]
[45] 次のようにしなければ[['''なりません''']] [SRC[>>22]]。
[FIG(steps)[
= [78] [VAR[設定群オブジェクト]]を、[VAR[スクリプト]]の[F[[[設定群オブジェクト]]]]に設定します。
= [150] [VAR[設定群オブジェクト]]について[[スクリプトを実行できるか検査]]した結果が「実行しない」なら、
== [146] [CODE(JS)@en[undefined]] を返し、ここで停止します。
= [151] [VAR[設定群オブジェクト]]について[[スクリプトを実行する準備]]をします。
= [25] [VAR[結果]]を、 [CODE[[[ParseScript]]([VAR[スクリプト]]の[F[[[ソーステキスト]]]], [VAR[設定群オブジェクト]]の[F[[[Realm]]]], [VAR[スクリプト]])]]
に設定します。
= [82] [VAR[結果]]が[[エラー]]の [[List]] なら、
== [24] [VAR[結果]]を、[VAR[結果]]の最初の要素に設定します。
== ☆
= [87] それ以外なら、
== [84] [VAR[状態]]を、 [CODE[[[ScriptEvaluation]]([VAR[結果]])]] に設定します。
== [52] [VAR[状態]]が[[走っているスクリプトの実行中断]]なら、
=== ●
== [85] それ以外で、 [VAR[状態]]が [[abrupt completion]] なら、
=== [86] [VAR[結果]]を、[CODE[[VAR[状態]].[F(ss)[[[value]]]]]] に設定します。
=== ☆
== [83] それ以外なら、
=== ▲
= [53] ●の場合、
== [63] [VAR[エラーを再度投げる]]フラグが設定されているなら、
=== [54] [[走っているスクリプトの実行中断]]をします。 [SRC[>>68]]
= [152] ☆の場合、
== [48] [VAR[エラーを再度投げる]]フラグが設定されているなら、
=== [107] [VAR[スクリプト]]の[F[[[エラーミュート]]]]フラグが設定されていれば、
==== [108] [CODE(DOMe)@en[[[NetworkError]]]] [[例外]]を[[投げ]]ます。
=== [106] それ以外なら、
==== [56] [VAR[スクリプト]]について[VAR[結果]]の[[例外を報告]]します。
= [26] [VAR[設定群オブジェクト]]について[[コールバックを走らせた後の片付け]]をします。
= [81] ▲なら、
== [88] [CODE[[VAR[状態]].[F(ss)[value]]]] を返します。
= [89] それ以外なら、
== [109] 何も返しません。
]FIG]
;; [79] この手続きが返す値が使われるのは、 [CODE(URI)@en[[[javascript:]]]]
[[URL]] の実行の時だけのようです。
[80] [[モジュールスクリプト]][VAR[スクリプト]]について[DFN[[RUBYB[モジュールスクリプトを実行]@en[run a module script]]]]するとは、
次のようにしなければ[['''なりません''']] [SRC[>>22]]。
[FIG(steps)[
= [90] [VAR[設定群オブジェクト]]を、[VAR[スクリプト]]の[F[[[設定群オブジェクト]]]]に設定します。
= [91] [VAR[設定群オブジェクト]]について[[スクリプトを実行できるか検査]]した結果が「実行しない」なら、ここで停止します。
= [92] [VAR[記録]]を、[VAR[スクリプト]]の[F[[[モジュール記録]]]]に設定します。
= [93] [VAR[実現値化状態]]を、[CODE[[VAR[記録]].[CODE[[[ModuleDeclarationInstantiation]]]]()]]
に設定します。
= [110] [VAR[実現値化状態]]が [[abrupt completion]] なら、
== [111] [VAR[スクリプト]]について[CODE[[VAR[実現値化状態]].[F(ss)[[[value]]]]]]の[[例外を報告]]します。
== [112] ここで停止します。
= [113] [VAR[設定群オブジェクト]]について[[スクリプトを実行する準備]]をします。
= [114] [VAR[評価状態]]を、[CODE[[VAR[記録]].[CODE[[[ModuleEvalution]]]]()]]
に設定します。
= [115] [VAR[評価状態]]が[[走っているスクリプトの実行中断]]ではなく、
[[abrupt completion]] であるなら、
== [116] [VAR[スクリプト]]について[CODE[[VAR[評価状態]].[F(ss)[[[value]]]]]]の[[例外を報告]]します。
= [153] [VAR[設定群オブジェクト]]について[[コールバックを走らせた後の片付け]]をします。
]FIG]
[94] [[環境設定群オブジェクト]][VAR[設定群オブジェクト]]についての[DFN[[RUBYB[[[スクリプト実行の準備]]]@en[prepare to run script]]]]は、
次のようにします [SRC[>>22]]。
[FIG(steps)[
= [96] [VAR[設定群オブジェクト]]の[F[[[候補入口設定群オブジェクト]]]]フラグを設定します。
= [97] [[JavaScript実行文脈スタック]]に[VAR[設定群オブジェクト]]の[F[[[realm実行文脈]]]]を[[積み]]ます。
(新たな[[走っているJavaScript実行文脈]]となります。)
]FIG]
[HISTORY[
[154] 以前は現[[スクリプトを実行できるか検査]]と合わせて[DFN[[RUBYB[[[コールバックを走らせる準備]]]@en[prepare to run a callback]]]]と呼ばれていました。
]HISTORY]
[95] [[環境設定群オブジェクト]][VAR[設定群オブジェクト]]について[DFN[[RUBYB[[[スクリプトを走らせた後の片付け]]]@en[clean up after running a script]]]]
(旧[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]
[165] [[JavaScriptエンジン]]の[DFN[[F[[RUBYB[[[走っているスクリプト]]]@en[running script]]]]]]は、
[F[走っているJavaScript実行文脈]]の [F[ScriptOrModule]] の
[F(ss)[HostDefined]] の値である[[スクリプト]]です [SRC[>>164]]。
[HISTORY[
[77] [[JavaScriptエンジン]]の[DFN[[F[[RUBYB[[[走っている実行文脈に対応するスクリプト]]]@en[script corresponding to the running execution context]]]]]]は、
[F[[[走っているJavaScript実行文脈]]]]の [F[[CODE[ScriptOrModule]]]]
の [CODE[[F(ss)[HostDefined]]]] の値である[[スクリプト]]です。 [SRC[>>76]]
]HISTORY]
* 実行制限と中断
[49] [[スクリプトの中断]]を参照。
* ごみ収集
[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>
[28] [CITE@en[Use "credentials mode" instead of "CORS setting" for modules · whatwg/html@7a0ce07]]
([TIME[2016-02-04 17:40:22 +09:00]] 版)
<https://github.com/whatwg/html/commit/7a0ce073a8fbade8f44d0e2d4c709ad7cf3ee312>
[29] [CITE@en[Add module workers · whatwg/html@e3a5bb7]] ([TIME[2016-02-15 22:51:19 +09:00]] 版) <https://github.com/whatwg/html/commit/e3a5bb757f64374c37d8c4528c01298463ef0b2a>
[51] [CITE@en[Fix #715: clarify how aborting a running script works · whatwg/html@6a48bfb]]
([TIME[2016-02-24 15:17:55 +09:00]] 版)
<https://github.com/whatwg/html/commit/6a48bfbf1066034eab4786d62ba4017593c48430>
[166] [CITE@en[Clarify settings object, realm, and global relationships · whatwg/html@0866f1b]]
([TIME[2016-03-28 00:17:21 +09:00]] 版)
<https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>
[167] [CITE@en[Pass cryptographic nonce metadata to Fetch · whatwg/html@5479e07]]
([TIME[2016-04-07 16:20:34 +09:00]] 版)
<https://github.com/whatwg/html/commit/5479e07a6f6e01062b85b5fe6799752b0370336c>
[145] [CITE@en[Detail how javascript: return values become response bodies · whatwg/html@9997cd9]]
([TIME[2016-04-27 16:37:36 +09:00]] 版)
<https://github.com/whatwg/html/commit/9997cd93c65a9f4a640a593c02f01c2c58924457>
[168] [CITE@en[Should we be doing prepare to run a script/clean up after running a script more often? · Issue #855 · whatwg/html]]
([TIME[2016-07-02 11:19:36 +09:00]])
<https://github.com/whatwg/html/issues/855>
[169] [CITE@en[Editorial: fix typo in running a module script]]
([[domenic]]著, [TIME[2016-06-30 16:40:50 +09:00]])
<https://github.com/whatwg/html/commit/4b9a96849c4a9a78c8cae9febe5eeb08182ce7e0>