-
Notifications
You must be signed in to change notification settings - Fork 4
/
254.txt
136 lines (115 loc) · 7.26 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
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
* 仕様書
[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] [[コールバック関数]]の[DFN[[RUBYB[呼び出し]@en[invoke]]]] [SRC[>>3]] は、
次の[[引数]]に関する操作です。
[FIG(list members)[
: [VAR[呼び出し可能]] : [[コールバック関数]]として使用する、[[コールバック関数型]]の値。
: [VAR[this]] : [[コールバック関数]]の [CODE(JS)@en[this]] として使う値。
[[既定値]]は [CODE(JS)@en[undefined]] [SRC[>>3]]。
: [VAR[引数リスト]] : [[コールバック関数]]の[[引数]]の[[リスト]]。
各値は、[[IDL値]]か、省略を表す特殊値「[RUBYB[なし]@en[missing]]」のいずれかです [SRC[>>3]]。
]FIG]
[16] 次のようにします [SRC[>>3]]。
[FIG(steps)[
= [17] [VAR[F]] を、[VAR[呼び出し可能]]の [[JavaScript]] [[オブジェクト]]に設定します。
= [18] [VAR[F]] に [CODE[IsCallable]] を適用した結果が[[偽]]なら、
== [19] [VAR[呼び出し可能]]の[F[返り型]]が [CODE(IDL)@en[void]] なら、
=== [20] ここで停止します。
== [21] それ以外なら、
=== [22] [CODE(JS)@en[undefined]] を[VAR[呼び出し可能]]の[F[返り型]]に[[変換][変換 (WebIDL)]]した結果を返し、ここで停止します。
= [23] [VAR[realm]] を、 [VAR[F]] の[F[Realm]]に設定します。
= [24] [VAR[設定群]]を、 [VAR[realm]] の[F[設定群オブジェクト]]に設定します。
= [25] [VAR[設定群]]について、[[スクリプトを走らせる準備]]を実行します。
= [26] [VAR[リスト]]を、空の[[リスト]]に設定します。
= [36] [VAR[数]]を、 [N[0]] に設定します。
= [27] [VAR[引数リスト]]の各値[VAR[値]]について、順に、
== [28] [VAR[値]]が「なし」なら、
=== [29] [VAR[リスト]]の末尾に [CODE(JS)@en[undefined]] を追加します。
== [30] それ以外なら、
=== [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)]]した結果に設定します。
= [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]]]] の呼び出しは、
途中で[[走っているスクリプトの実行中断]]が発生することがあります。
* 文脈
[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]]]]
- [[カスタム要素反応群の呼び出し]]からの[[コールバック反応]]の呼び出し [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]]]] でも同様の処理を挟む必要がありそうですが、
明文化されていません。
]FIG]
;; [7] [[イベントリスナー]]や [CODE(DOMi)@en[[[NodeFilter]]]]
は[[コールバックインターフェイス]]です。
;; [12] [CODE(JS)@en[[[Promise]]]] の[[コールバック]]は、
[[JavaScriptジョブの実行]]で処理されます。
;; [14] [[カスタム要素構築器]]は、[[要素の格上げ]]で呼び出されます。
他の[[コールバック]]とは違った処理となっています。
* 歴史
[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>
[13] [CITE@en[17713 – Exceptions thrown from event handlers should not be propagated]]
([TIME[2016-03-15 12:04:31 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=17713>
[15] [CITE@en[Merge pull request #113 from domenic/modernize-invoke]]
( ([[bzbarsky]]著, [TIME[2016-05-21 05:55:00 +09:00]]))
<https://github.com/heycam/webidl/commit/09c011d8de1077fe5991ceded97838650e376f6c>