-
Notifications
You must be signed in to change notification settings - Fork 4
/
832.txt
260 lines (218 loc) · 15.4 KB
/
832.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
* 仕様書
[REFS[
- [22] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <https://www.whatwg.org/specs/web-apps/current-work/#jump-to-a-code-entry-point>
- [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>
- [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>
- [62] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-08-01 13:15:24 +09:00]]) <https://html.spec.whatwg.org/#concept-incumbent-everything>
- [303] [CITE[Web IDL (Second Edition)]] ([TIME[2015-02-03 13:44:14 +09:00]] 版) <http://heycam.github.io/webidl/#es-invoking-callback-functions>
]REFS]
* 古典スクリプトの実行
[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]
* コールバック関数の実行
[3] [[コールバック関数]]の[DFN[[RUBYB[呼び出し]@en[invoke]]]] [SRC[>>303]] は、
次の[[引数]]に関する操作です。
[FIG(list members)[
: [VAR[呼び出し可能]] : [[コールバック関数]]として使用する、[[コールバック関数型]]の値。
: [VAR[this]] : [[コールバック関数]]の [CODE(JS)@en[this]] として使う値。
[[既定値]]は [CODE(JS)@en[undefined]] [SRC[>>303]]。
: [VAR[引数リスト]] : [[コールバック関数]]の[[引数]]の[[リスト]]。
各値は、[[IDL値]]か、省略を表す特殊値「[RUBYB[なし]@en[missing]]」のいずれかです [SRC[>>303]]。
]FIG]
[4] 次のようにします [SRC[>>303]]。
[FIG(steps)[
= [17] [VAR[F]] を、[VAR[呼び出し可能]]の [[JavaScript]] [[オブジェクト]]に設定します。
= [18] [VAR[F]] に [CODE[IsCallable]] を適用した結果が[[偽]]なら、
== [7] [VAR[呼び出し可能]]の[F[返り型]]が [CODE(IDL)@en[void]] なら、
=== [10] ここで停止します。
== [13] それ以外なら、
=== [15] [CODE(JS)@en[undefined]] を[VAR[呼び出し可能]]の[F[返り型]]に[[変換][変換 (WebIDL)]]した結果を返し、ここで停止します。
= [5] [VAR[realm]] を、 [VAR[F]] の[F[Realm]]に設定します。
= [16] [VAR[関連設定群]]を、 [VAR[realm]] の[F[設定群オブジェクト]]に設定します。
= [19] [VAR[蓄積設定群]]を、[VAR[値]]の[F[コールバック文脈]]に設定します。
= [20] [VAR[関連設定群]]について[[スクリプトを走らせる準備]]を実行します。
= [21] [VAR[蓄積設定群]]について[[コールバック実行の準備]]を実行します。
= [42] [VAR[リスト]]を、空の[[リスト]]に設定します。
= [59] [VAR[数]]を、 [N[0]] に設定します。
= [60] [VAR[引数リスト]]の各値[VAR[値]]について、順に、
== [27] [VAR[値]]が「なし」なら、
=== [28] [VAR[リスト]]の末尾に [CODE(JS)@en[undefined]] を追加します。
== [29] それ以外なら、
=== [31] [VAR[結果]]を、[VAR[値]]を [[JavaScript]] に[[変換][変換 (WebIDL)]]した結果に設定します。
=== [32] [VAR[結果]]が [[abrupt completion]] なら、
==== [33] >>43 に飛びます。
=== [34] それ以外なら、
==== [35] [VAR[リスト]]の末尾に[VAR[結果]]の[F(ss)[値]]を追加します。
=== [37] [VAR[数]]を[[インクリメント]]します。
= [38] [VAR[リスト]]の末尾の値を削除して要素数が[VAR[数]]となるようにします。
= [39] [VAR[結果]]を、[CODE[[[Call]]([VAR[F]], [VAR[this]], [VAR[リスト]])]]
の結果に設定します。
= [40] [VAR[結果]]が [[abrupt completion]] 以外なら、
== [41] [VAR[結果]]を、[VAR[結果]]の[F(ss)[値]]を[VAR[呼び出し可能]]の[F[返り型]]に[[変換][変換 (WebIDL)]]した結果に設定します。
= [57] [VAR[蓄積設定群]]について[[コールバックを走らせた後の片付け]]を実行します。
= [43] [VAR[関連設定群]]について[[スクリプトを走らせた後の片付け]]を実行します。
= [44] [VAR[結果]]が [[abrupt completion]] なら、
== [47] [VAR[呼び出し可能]]の[F[返り型]]が[[約束型]]なら、
=== [50] [VAR[結果]]を、[CODE[[[%Promise%]].[[reject]]]] の[[初期値]]を呼び出した結果に設定します。
[FIG(list members)[
: [VAR[[CODE(JS)[this]]]] : [CODE[%Promise%]]
: [VAR[引数リスト]] :
[FIG(list)[
= [VAR[結果]]の[F(ss)[値]]
]FIG]
]FIG]
=== [51] [VAR[結果]]を[VAR[返り型]]に[[変換][変換 (WebIDL)]]した結果を返します。
== [48] それ以外なら、
=== [49] [VAR[結果]]を返します。
= [45] それ以外なら、
== [46] [VAR[結果]]を返します。
]FIG]
[9] つまり[[コールバック関数]]を実行するものですが、
[[JavaScript]] と [[Web IDL]] の値の変換、
[[JavaScript実行文脈スタック]]の操作、
[[例外]]の [CODE(DOMi)@en[[[Promise]]]] 化を適宜処理するものです。
[11] [F(ss)[[[Call]]]] の呼び出しは、
途中で[[走っているスクリプトの実行中断]]が発生することがあります。
[58] 似たような処理が[[利用者オブジェクト]]についても規定されています。
[61] [[コールバック関数の呼び出し]]は、次の場面で行われます。
[FIG(list)[
- [[Web IDL]] [[iterator]] の [CODE(IDL)@en[[[forEach]]]] [SRC[[[Web IDL]]]]
- [[イベントハンドラー]]の呼び出し [SRC[[[HTML Standard]]]]
- [[タイマー]]の呼び出し [SRC[[[HTML Standard]]]]
- [[アニメーションフレームコールバック]]の呼び出し [SRC[[[HTML Standard]]]]
- [[カスタム要素反応群の呼び出し]]からの[[コールバック反応]]の呼び出し [SRC[[[HTML Standard]]]]
;; [8] [[変異観察器]]、[[Geolocation API]] の[[コールバック]]、
[CODE(DOMm)@en[[[getAsString]]]] の[[コールバック]]、
[CODE(DOMm)@en[[[toBlob]]]] の[[コールバック]]、
[CODE(DOMi)@en[[[PortCollection]]]] の [CODE(DOMm)@en[[[iterate]]]] の[[コールバック]]、
[CODE(DOMi)@en[[[RTCPeerConnection]]]] の[[コールバック]]、
[CODE(DOMi)@en[[[NSResolver]]]] でも同様の処理を挟む必要がありそうですが、
明文化されていません。
[HISTORY[
- [CODE(DOMm)@en[setImmediate]]
]HISTORY]
]FIG]
;; [12] [CODE(JS)@en[[[Promise]]]] の[[コールバック]]は、
[[JavaScriptジョブの実行]]で処理されます。
;; [14] [[カスタム要素構築器]]は、[[要素の格上げ]]で呼び出されます。
他の[[コールバック]]とは違った処理となっています。
@@ [6] [[コールバックインターフェイス]]
* 準備と後片付け
[94] [[環境設定群オブジェクト]][VAR[設定群オブジェクト]]についての[DFN[[RUBYB[[[スクリプト実行の準備]]]@en[prepare to run script]]]]は、
次のようにします [SRC[>>22]]。
[FIG(steps)[
= [96] [VAR[設定群オブジェクト]]の[F[realm実行文脈]]の[F[入口計数器]]を [N[1]] [[インクリメント]]します。
= [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)[
= [30] [VAR[設定群オブジェクト]]の[F[[[realm実行文脈]]]]を[[JavaScript実行文脈スタック]]から削除します。
= [101] [VAR[設定群オブジェクト]]の[F[realm実行文脈]]の[F[入口計数器]]を [N[1]] [[デクリメント]]します。
= [31] [[JavaScript実行文脈スタック]]が空なら、
== [102] [[大域スクリプト片付けジョブを走らせます]]。
=- [33] ここでは[[スクリプト]]は走りません。
= [32] [[JavaScript実行文脈スタック]]が空なら、
== [103] [[マイクロタスクチェックポイント]]を行います。
=- [34] ここでは[[スクリプト]]が再帰的に走らせられることがあります。
]FIG]
;; [71] [[スクリプト実行の準備]]と[[スクリプトを走らせた後の片付け]]は、
[[コールバック関数の呼び出し]]や
[CODE[EnqueueJob]] による[[マイクロタスク]]でも呼び出されます。
@@ [64] コールバック実行準備
[SRC[>>62]]
[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] [[スクリプトの中断]]を参照。
* 歴史
[2] [[スクリプト]]、[[コールバック関数]]も参照。