/
254.txt
101 lines (86 loc) · 5.61 KB
/
254.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
* 仕様書
[REFS[
- [3] [CITE[Web IDL (Second Edition)]] ([TIME[2015-02-03 13:44:14 +09:00]] 版) <http://heycam.github.io/webidl/#es-invoking-callback-functions>
]REFS]
* 呼び出し
[5] [[JavaScript]] [[呼び出し可能オブジェクト]]は、
次のように [[Web IDL]] [[コールバック関数]]として[DFN[[RUBYB[呼び出し]@en[invoke]]]]できます [SRC[>>3]]。
[FIG(steps)[
= [VAR[V]] は、指定された [[Web IDL]] [[コールバック関数]]型の値とします。
= [[コールバックthis値]]は、指定された値か、指定がなければ [CODE(JS)@en[[[undefined]]]]
とします。
= [[引数]]群は、指定された値のリストとします。ここで指定できる各値は、 [[Web IDL]]
の値か、省略可能な引数の無指定を表す「[RUBYB[なし]@en[missing]]」のいずれかです。
= 次の処理を実行します。
== [VAR[F]] を、 [VAR[V]] に対応する [[JavaScript]] [[オブジェクト]]とします。
== [CODE[[[IsCallable]]([VAR[F]])]] が[[偽]]なら、 [VAR[R]] を [CODE(JS)@en[[[undefined]]]]
とします。
== そうでないなら、
=== [[引数]]群の「なし」以外の値を数えます。
=== [[引数]]群に含まれる [[Web IDL]] 値を [[JavaScript値に変換]]し、
「なし」を [CODE(JS)@en[[[undefined]]]] に変換したリストを用意します。
=== 用意したリストの先頭から、「なし」以外の値の数の分だけ残し、後は削除します。
=== [[スクリプト]]を [VAR[V]] の[[コールバック文脈]]とします。
=== [[スクリプト]]を[[現職スクリプトのスタック]]に [[push]] します。
=== [VAR[F]] の [CODE[[[''[''[Call]'']'']]]] [[メソッド]]を呼び出します。
[CODE(JS)@en[[[this]]]] は[[コールバックthis値]]、
[[引数値]]群は用意したリストとします。結果を [VAR[R]] とします。
[[例外]]が投げられるかもしれません。
=== [[現職スクリプトのスタック]]から[[スクリプト]]を [[pop]] します。
=== [[例外]]が投げられていれば、ここで停止し、[[伝播]]させます。
== [[コールバック関数]]の[[返し型]]が [CODE(IDL)@en[[[void]]]] なら、
何も返しません。
== そうでなければ、 [VAR[R]] を[[コールバック関数]]の[[返し型]]にと
[[IDL値に変換]]し、これを返します。
= この処理で[[例外]]が投げれた場合には、
== [[コールバック関数]]の[[返し型]]が[[約束型]]なら、
[CODE(JS)@en[[[%Promise%]].[[reject]]]] の初期値を呼び出します。
[CODE(JS)@en[[[this]]]] を [CODE(JS)@en[[[%Promise%]]]] とし、
[[例外]]を[[引数値]]とします。その結果を返します。
== それ以外なら、[[例外]]を[[伝播]]させます。
]FIG]
[9] つまり[[コールバック関数]]を実行するものですが、
[[JavaScript]] と [[Web IDL]] の値の変換、
[[スクリプト設定群オブジェクトのスタック]]の操作、
[[例外]]の [CODE(DOMi)@en[[[Promise]]]] 化を適宜処理するものです。
* 文脈
[10] [[コールバック関数]]として定義された次の[[型]]があります。
[FIG(middle list)[
- [CODE(IDL)@en[[[Function]]]] [SRC[[[Web IDL]]]]
- [CODE(IDL)@en[[[VoidFunction]]]] [SRC[[[Web IDL]]]]
- [CODE(IDL)@en[[[MutationCallback]]]] [SRC[[[DOM Standard]]]]
- [CODE(IDL)@en[[[EventHandlerNonNull]]]] [SRC[[[HTML Standard]]]]
- [CODE(IDL)@en[[[OnBeforeUnloadEventHandlerNonNull]]]] [SRC[[[HTML Standard]]]]
- [CODE(IDL)@en[[[OnErrorEventHandlerNonNull]]]] [SRC[[[HTML Standard]]]]
- [CODE(IDL)@en[[[BlobCallback]]]] [SRC[[[HTML Standard]]]]
- [CODE(IDL)@en[[[FunctionStringCallback]]]] [SRC[[[HTML Standard]]]]
- [CODE(IDL)@en[[[PortCollectionCallback]]]] [SRC[[[HTML Standard]]]]
- [CODE(IDL)@en[[[NotificationPermissionCallback]]]] [SRC[[[Notifications API Standard]]]]
- [CODE(IDL)@en[[[FrameRequestCallback]]]] [SRC[[[HTML Standard]]]]
]FIG]
[6] [[コールバック関数の呼び出し]]は、次の場面で行われます。
[FIG(list)[
- [[Web IDL]] [[iterator]] の [CODE(IDL)@en[[[forEach]]]] [SRC[[[Web IDL]]]]
- [[イベントハンドラー]]の呼び出し [SRC[[[HTML Standard]]]]
- [[タイマー]]の呼び出し [SRC[[[HTML Standard]]]]
- [[アニメーションフレームコールバック]]の呼び出し [SRC[[[HTML Standard]]]]
]FIG]
;; [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]]]]、
[CODE(JS)@en[[[Promise]]]] の[[コールバック]]、
[CODE(JS)@en[[[Object.observer]]]] でも同様の処理を挟む必要がありそうですが、
明文化されていません。
;; [7] [[イベントリスナー]]や [CODE(DOMi)@en[[[NodeFilter]]]]
は[[コールバックインターフェイス]]です。
* 歴史
[1] [CITE[IRC logs: freenode / #whatwg / 20131109]]
( ([TIME[2013-11-10 18:07:17 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20131109>
[2] [CITE@en[Bug 19211 – The event handler processing algorithm talk about jumping to a code entry-point]]
( ([TIME[2013-11-10 18:14:45 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=19211>
[4] [CITE@en[Web Applications 1.0 r8880 Fix callback logic to reference Web IDL and use the right conventions.]] ([TIME[2015-01-16 05:52:00 +09:00]] 版) <https://html5.org/r/8880>