/
866.txt
204 lines (154 loc) · 14.4 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
[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>
]REFS]
* 構成要素
[12] [DFN[[[スクリプト]]]]は次のものを有します [SRC[>>11]]。
[FIG(list members)[
- [13] [DFN[[RUBYB[[[コード入口点]]]@en[code entry-point]]]]: [[スクリプト]]が他の[[スクリプト]]や[[利用者エージェント]]に晒す、
[[実行可能コード]]の[[ブロック]]。一般的には[[コード入口点]]に対応する[[コード]]は[[スクリプト]]が[[構文解析]]された直後に実行されますが、
[[イベントハンドラー]]の場合は呼び出される度に実行されます。 [SRC[>>11]]
-- [14] [[JavaScript]] の [CODE(HTMLe)@en[[[script]]]] [[ブロック]]の場合には、[[大域コード]]の[[実行文脈]]に対応します。 [SRC[>>11]]
-- [19] 実行すると値を返したり、[[例外]]を投げたりします。
- [15] [DFN[[RUBYB[[[エラーミュート]]]@en[muted errors]]]]フラグ: 設定されている場合には、
この[[スクリプト]]の[[エラー]]にはエラー情報を提供しません。 [SRC[>>11]]
-- [16] [[起源]]が異なる[[スクリプト]]についてのエラーから私的な情報が流出する虞があるので、
これを抑制するために使います。 [SRC[>>11]]
- [17] [DFN[[RUBYB[[[設定群オブジェクト]]]@en[settings object]]]]: [[スクリプト設定群オブジェクト]]。
同じ文脈の他の[[スクリプト]]と共有している設定諸々です。 [SRC[>>11]]
-- [DFN[[RUBYB[[[スクリプトの関連する設定群オブジェクト]]]@en[[[relevant settings object for a script]]]]]]とも呼ばれます [SRC[>>11]]。
]FIG]
;; [18] >>17 は、[[スクリプト]]から[[環境設定群オブジェクト]]への[[強い参照]]です [SRC[[[HTML Standard]]]]。
* 生成
[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) [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]]]]
;; [40] 仕様書が存在しませんが、次のものもあります。
- [[XBL1]] ([[Gecko]] のみ)、[[HTC]] ([[IE]] のみ)
- [CODE(CSS)@en[[[expression()]]]] ([[IE]] のみ)
]FIG]
* 実行
[23] [[スクリプト]]の[DFN[[RUBYB[[[コード入口点に飛ぶ]]]@en[jump to a code entry-point]]]]とは、
次の手順です [SRC[>>22]]。
[FIG(steps)[
= [24] [[スクリプト設定群オブジェクト]]を使って[DFN[[RUBYB[[[コールバックを走らせる準備]]]@en[prepare to run a callback]]]]をします。
== [27] [[環境設定群オブジェクト]]の[[大域オブジェクト]]が [CODE(DOMi)@en[[[Window]]]]
でその [CODE(DOMi)@en[[[Document]]]] が[[完全に活性]]でないなら、「[RUBYB[走らせない]@en[do not run]]」とします。
== [28] [[スクリプト設定群オブジェクト]]の[[有責閲覧文脈]]で[[スクリプトが無効]]なら、「走らせない」とします。
== [29] これら以外なら、[[スクリプト設定群オブジェクト]]を[[スクリプト設定群オブジェクトのスタック]]に [[push]]
して、[[入口設定群オブジェクト]]フラグを立てます。「[RUBYB[走らせる]@en[run]]」とします。
=- 「走らせない」であれば、ここで終わります。
= [25] '''[[スクリプト設定群オブジェクト]]から適切な[[スクリプト実行環境]]を選んで、それを使って[[スクリプト]]の[[コード入口点]]を実行します。'''
= [26] [DFN[[RUBYB[[[コールバックを走らせた後の片付け]]]@en[clean up after running a callback]]]]をします。
== [30] [[スクリプト設定群オブジェクトのスタック]]から[[現職設定群オブジェクト]]を [[pop]] します。
== [31] [[スクリプト設定群オブジェクトのスタック]]が空なら、[[大域スクリプト片付けジョブを走らせます]]。
==- [33] ここでは[[スクリプト]]は走りません。
== [32] [[スクリプト設定群オブジェクトのスタック]]が空なら、[[マイクロタスクチェックポイント]]を行います。
==- [34] ここでは[[スクリプト]]が再帰的に走らせられることがあります。
]FIG]
[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]] されなかったりすることがあります。
この場合の挙動は[[エラーの報告]]の項をご覧ください。
* 作成
[39] [DFN[[RUBYB[[[スクリプトの作成]]]@en[create a script]]]]は、
[[ワーカー]]と[[イベントハンドラー]]を除く[[スクリプト]]を作り、実行する時に呼ばれる手順です。
この手順は次のようにしなければ[['''なりません''']] [SRC[>>38]]。
[FIG(steps)[
= [41] 入力として与えられた[[閲覧文脈]]で[[スクリプトが無効]]なら、 [[void]]
を返すだけのプログラムだった場合のようにし、これらの手順を終えます。
= [42] 入力として与えられた[[スクリプト設定群オブジェクト]]から、
入力として与えられた[[スクリプト言語]]の[[スクリプト実行環境]]を取得します。
= [43] >>42 の[[スクリプト実行環境]]を使って入力として与えられた[[ソース]]を[[構文解析]]、
[[コンパイル]]、[[初期化]]します。
= [46] 新しい[[スクリプト]]を作ります。
=- [47] [[コード入口点]]は >>43 の結果とします。
=- [44] [[設定群オブジェクト]]と[[エラーミュートフラグ]]は入力として与えられたものとします。
= [45] ここまで (特に >>43) に成功していれば、[[スクリプト]]の[[コード入口点に飛ぶ]]手順を実行します。
= [48] そうでなければ、[[エラーを報告]]します。
-- 入力として与えられた[[スクリプト設定群オブジェクト]]の[[大域スクリプト]]を対象として使います。
-- エラーが[[取り扱いされない]]なら、そのエラーを[[利用者]]に報告して[['''構いません''']]。
]FIG]
;; [50] 「作成」という手順ですが、実行も含まれています。
;; [56] >>48 は[[構文エラー]]など >>43 で検出されたエラーが報告されるのみで、実行時エラーは >>55
で報告されることになります。
* 実行制限と中断
[51] [[閲覧文脈]]は[[スクリプトが有効]]、[[スクリプトが無効]]の状態を有しており、
[[利用者エージェント]]の対応状況、[[利用者]]の設定、[[著者]]の指定によってどちらであるかが決定します。
[[スクリプトが無効]]の場合、[[スクリプト]]が作成されなかったり、[[スクリプト]]の実行が実際の内容に関わらず
「何もしない」となったり (>>28) します。詳しくは[[スクリプトが無効]]の項をご覧ください。
[54] [[スクリプト]]の実行中に[[スクリプト]]が無効になったときは、ただちに[[スクリプト]]を終端する[['''べきです''']]
[SRC[>>49]]。
[52] [[利用者エージェント]]は、[[スクリプト]]に対して[[資源]]の制限を課して[['''構いません''']]。
例えば、[[CPU]] [[quota]]、[[メモリー]]の制限、合計実行時間の制限、[[帯域]]の制限などを課すことができます。 [SRC[>>49]]
[53] [[スクリプト]]が制限を超えた時は、 [CODE(DOMc)@en[[[QuotaExceededError]]]] [[例外]]を[[投げる]]か、
[[例外]]なしで中断するか、[[利用者]]に確認するか、[[スクリプト]]の実行に[RUBYB[[[絞り弁]]]@en[throttele]]を適用するかして[['''構いません''']]。
[SRC[>>49]]
;; [63] [[ハードウェア等の制約に関する条項]]も参照。
* ごみ収集
[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] 詳しくは[[イベントループ]]の項を参照してください。
* 歴史
[3] ([[HTML]] の) [[クライアント]]側[DFN[[RUBYB[スクリプト][script]]]]とは、
HTML 文書に添えられた、あるいは HTML 文書中に埋込まれた[[プログラム]]です。
このプログラムは文書が読込まれた時、あるいは[[連結]]が[[活性化]]された時などに、
クライアントの機械上で実行されます。
[[HTML 4]] [CITE[18.1 Introduction to scripts]]
<http://www.w3.org/TR/html4/interact/scripts.html#idx-script> より
[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]
* メモ
[1] ''DynamicScripting'' <http://www.interq.or.jp/student/exeal/dss/> [[JavaScript]] 系, [[VBScript]], [[DOM]], [[WSH]] などについて。著者は mozilla.gr.jp の和訳プロジェクトに参加している人だそうです。 [[W3C]] などの仕様もちゃんと参照していますし、内容は信頼できます。
[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>