[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>'''
- [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>
- [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>
- [24] [CITE@en[Service Workers Nightly]] ([TIME[2017-02-16 20:10:49 +09:00]]) <https://w3c.github.io/ServiceWorker/#dfn-type>
- [30] [CITE@en[Service Workers Nightly]] ([TIME[2017-02-16 20:10:49 +09:00]]) <https://w3c.github.io/ServiceWorker/#dfn-script-resource>
- [32] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#serviceworkercontainer-interface>
- [33] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#dfn-job-worker-type>
]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]]
それぞれ[[古典スクリプト]]と[[モジュールスクリプト]]を表します。

[25] [[サービスワーカー]]は、[DFN[[F[[RUBYB[[[型][スクリプト型]]]@en[type]]]]]]を持ちます。
その値は [CODE[classic][古典スクリプト]] か [CODE[module][モジュールスクリプト]] のいずれかです。
初期値は [CODE[classic][古典スクリプト]] です。 [SRC[>>24]] それぞれ[[古典スクリプト]]と[[モジュールスクリプト]]を表します。

[34] [[ジョブ][サービスワーカージョブ]]は、[DFN[[F[[RUBYB[[[ワーカー型]]]@en[worker type]]]]]]を持ちます
[SRC[>>33]]。その値は [CODE[classic][古典スクリプト]] か
[CODE[module][モジュールスクリプト]] のいずれかです [SRC[>>33]]。

[155] [[ワーカー]]の作成時には、 [CODE(DOMi)@en[[[WorkerOptions]]]] [[辞書]]の
[DFN[[CODE[type][WorkerType]]]] [[メンバー][辞書メンバー]] [SRC[>>100]] や
[CODE(DOMi)@en[ServiceWorkerOptions]] [[辞書]]の
[DFN[[CODE(DOMa)@en[type][WorkerType]]]] [[メンバー][辞書メンバー]] [SRC[>>32]] の値により、
[[古典スクリプト]]か[[ワーカースクリプト]]のいずれかを指定できます。
値は [DFN[[CODE(DOMi)@en[[[WorkerType]]]]]] [SRC[>>100, >>32]]、すなわち
[DFN[[CODE[classic][古典スクリプト]]]] か
[CODE[module][モジュールスクリプト]] のいずれか [SRC[>>156]] です。
[CODE[type][WorkerType]] 省略時の既定値は [CODE[classic][古典スクリプト]]
です [SRC[>>100, >>32]]。

[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]]]]
:serviceworker: [CODE(DOMi)@en[ServiceWorker]]
: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: ○
:serviceworker: [CODE(JS)@en[[[navigator.serviceWorker]].[[register]] (..., {[[type][スクリプト型]]: "[[classic][古典スクリプト]]"})]]

:html: [[モジュールスクリプト]]
:js: [[モジュール][モジュールスクリプト]]
:workertype: [CODE[module][モジュールスクリプト]]
:script: [CODE(HTML)@en[<[[script]] [[type][<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: ×
:serviceworker: [CODE(JS)@en[[[navigator.serviceWorker]].[[register]] (..., {[[type][スクリプト型]]: "[CODE[module][モジュールスクリプト]]"})]]

]FIG]

* 状態

[12] [DFN[[RUBYB[[[スクリプト]]]@en[script]]]] [SRC[>>11]] は、
次の[[状態]]を持ちます。

[FIG(list members)[ [83] [[スクリプト]]の持つ状態
:[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]
:[DFN[[F[[RUBYB[[[記録][スクリプトの記録]]]@en[record]]]]]]: 
[[古典スクリプト]]の場合は[[スクリプト記録]]、
[[モジュールスクリプト]]の場合は[[ソーステキストモジュール記録]]。
あるいは[F[構文解析誤り]]が値を持つ場合、 [CODE[null]]。
[SRC[>>11]]
: [DFN[[RUBYB[[[構文解析誤り]]]@en[parse error]]]] :
[[JavaScript値]]。 [SRC[>>11]]
: [DFN[[RUBYB[再び投げるエラー]@en[error to rethrow]]]] :
[[JavaScript値]]。 [SRC[>>11]]
:[F[[[基底URL]]]]:
[[モジュール指定子を解決]]する時に使う[[基底URL]]です。
[[外部スクリプト]]では[[スクリプト]]を取得した [[URL]] で、
[[文書]]中の[[スクリプト]]では[[文書基底URL]]です。 [SRC[>>11]]
: [F[fetchオプション群]] :
[[スクリプトfetchオプション群]] [SRC[>>11]]。

]FIG]

[120] [[古典スクリプト]]は次の[[状態]]をも持ちます。

[FIG(list members)[
:[15] [DFN[[F[[RUBYB[[[エラーミュート]]]@en[muted errors]]]]]]フラグ: 設定されている場合には、
この[[スクリプト]]の[[エラー]]にはエラー情報を提供しません。 [SRC[>>11]]
[16] [[起源]]が異なる[[スクリプト]]についてのエラーから私的な情報が流出する虞があるので、
これを抑制するために使います。 [SRC[>>11]]
:[F[元の[[資源]]の[[絶対URL]]]]: [[エラーの報告]]で使われます。

[HISTORY[
:[DFN[[F[[RUBYB[ソーステキスト]@en[source text]]]]]]:
[[JavaScript]] [CODE[[[Script]]]] として[[評価]]されることになる、
実行可能なコードのブロックを含む[[文字列]] [SRC[>>11]]。
[[更新][更新ジョブ]]時に[[バイト列]]として[[比較]]されることがあります。
[F[記録][スクリプト]]に統合されました。
]HISTORY]
]FIG]

[122] [[モジュールスクリプト]]は、次の[[状態]]をも持ちます。

[FIG(list members)[ [37] [[モジュールスクリプト]]の持つ状態

[HISTORY[
: [F[状態][実現値化状態]] : [[スクリプト]]の読み込みの状態を表します。
: [F[モジュール記録]] :
[F[記録][スクリプト]]に統合されました。
: [DFN[[F[[RUBYB[[[実現値化前エラー]]]@en[pre-instantiation error]]]]]] : [[スクリプト]]の読み込みの失敗を説明する値です。
[F[構文解析誤り][スクリプト]]に統合されました。
:[F[[[credentials mode]]]]:
[[輸入されたモジュール]]を [[fetch]] するのに使う [[credentials mode]] です [SRC[>>11]]。
[F[fetchオプション群]]に統合されました。
: [F[暗号学的nonce]] :
[[モジュールスクリプトのfetch]]の際の [[nonce]] の検査に使う[[文字列]]です。
[F[fetchオプション群]]に統合されました。
: [F[構文解析器状態]] :
[[モジュールスクリプトのfetch]]の際の[F[構文解析器メタデータ]]として使う値です。
[F[fetchオプション群]]に統合されました。
: [F[エラーである][モジュールスクリプトがエラーである]] :
: [F[エラー][モジュールスクリプトのエラー]] :
: [F[実現値化されている]] :

]HISTORY]
]FIG]

-*-*-

[26] [[サービスワーカー]]は、
[DFN[[F[[RUBYB[[[スクリプト資源]]]@en[script resource]]]]]]を持ちます。
値は[[スクリプト]]または [CODE[null]] です。初期値は [CODE[null]] です。
[SRC[>>30]]

[31] [[スクリプト資源]]は、 ([CODE[null]] でないときに) 次の状態を持ちます。

[FIG(list members)[
: [DFN[[F[has ever been evaluated flag]]]] :
初期値は[[未設定]]。 [SRC[>>30]]
[[サービスワーカーを走らせる]]処理で利用されます。
: [F[HTTPS状態]] :
[[サービスワーカーを走らせる]]処理で利用されます。
: [F[参照元ポリシー]] :
[[サービスワーカーを走らせる]]処理で利用されます。
]FIG]

-*-*-

[161] [[スクリプト]]は、次のような一連の処理によって実行されます。
[FIG(steps)[
= [CODE(HTMLe)@en[[[script]]]] [[要素の挿入]]または[[ワーカー]][[構築子]]の呼び出し
= [[fetch]] ([[外部スクリプト]]の場合)
= 作成
= 実行
]FIG]

* fetch

[157] [[スクリプトのfetch]]も参照。

* 生成

[10] [[スクリプト]]は次の方法で生成することができます。

[FIG(list middle)[ [69] [[スクリプト]]の作成手段
- [[HTML]] [CODE(HTMLe)@en[[[script]]]] [[要素]]
- [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]]
- [[ワーカー]]
- [CODE(DOMm)@en[importScripts]]
- [CODE(URI)@en[[[javascript:]]]] [[URL]]
- [CODE(DOMm)@en[[[setTimeout]]]]/[CODE(DOMm)@en[[[setInterval]]]] への[[文字列]]引数
- [[JavaScript]] [CODE[import][import()]] ([[静的]])
- [[JavaScript]] [CODE[import()]] ([[動的]])
]FIG]

[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[[[エラーミュートフラグ]]]] ([[既定値]]は[[偽]])、
[VAR[オプション群]]、
[VAR[[[基底URL]]]]について、
次のようにします [SRC[>>38]]。

[FIG(steps)[
= [71] [VAR[スクリプト]]を、新しい[[古典スクリプト]]に設定します。
[FIG(list members)[ [68] [[古典スクリプト]]

: [F[設定群オブジェクト]] : [VAR[設定群]]
: [F[[[エラーミュートフラグ]]]] : [VAR[エラーミュートフラグ]]
: [F[構文解析エラー]] : [CODE[null]]
: [F[再び投げるエラー]] : [CODE[null]]
: [F[基底URL]] : [VAR[基底URL]]
: [F[fetchオプション群]] : [VAR[オプション群]]

]FIG]
= [130] [VAR[設定群]]の[F[有責閲覧文脈]]の[F[スクリプトが無効]]の場合、
== [131] [VAR[ソーステキスト]]を、[[空文字列]]に設定します。
= [63] [VAR[結果]]は、[VAR[ソーステキスト]]、
[VAR[設定群]]の[F[Realm]]、
[VAR[スクリプト]]について [CODE[ParseScript]] を実行した結果に設定します。
= [76] [VAR[結果]]が[[エラー]]の[[リスト]]の場合、
== [77] [VAR[スクリプト]]の[F[構文解析エラー]]を、 [VAR[結果]] [ [N[0]] ] に設定します。
== [94] [VAR[スクリプト]]の[F[再び投げるエラー]]を、 [VAR[結果]] [ [N[0]] ] に設定します。
= [78] それ以外の場合、
== [79] [VAR[スクリプト]]の[F[記録][スクリプト]]を、[VAR[結果]]に設定します。
= [80] [VAR[スクリプト]]を返します。
]FIG]

[127] [DFN[[RUBYB[モジュールスクリプトの作成]@en[create a module script]]]]は、
[VAR[ソーステキスト]]、
[VAR[設定群]]、
[VAR[スクリプト基底URL]]、
[VAR[オプション群]]について次のようにしなければ[MUST[なりません]] [SRC[>>38]]。

[FIG(steps)[
= [129] [VAR[スクリプト]]を、新しい[[モジュールスクリプト]]に設定します。
[FIG(list members)[ [48] [[モジュールスクリプト]]

: [F[モジュール記録]] : [CODE[null]]
: [F[[[設定群オブジェクト]]]] : [VAR[設定群]]
: [F[構文解析エラー]] : [CODE[null]]
: [F[再び投げるエラー]] : [CODE[null]]
: [F[基底URL]] : [VAR[スクリプト基底URL]]
: [F[fetchオプション群]] : [VAR[オプション群]]

]FIG]
= [134] [VAR[設定群]]の[F[有責閲覧文脈]]の[F[スクリプトが無効]]の場合、
== [135] [VAR[ソーステキスト]]を、[[空文字列]]に設定します。
= [139] [VAR[結果]]を、 [CODE[[[ParseModule]]([VAR[ソーステキスト]], [VAR[設定群]]の [F[Realm]], [VAR[スクリプト]])]] に設定します。
= [140] [VAR[結果]]が[[エラー]]の[[リスト]]の場合、
== [141] [VAR[スクリプト]]の[F[構文解析エラー]]を、 [VAR[結果]] [ [N[0]] ] に設定します。
= [143] それ以外の場合、
== [49] [VAR[記録]]の [F(ss)[RequestedModules]] の各[VAR[被要求]]について、順に、
=== [52] [VAR[URL]] を、
[VAR[スクリプト]]の[F[基底URL]]
と[VAR[被要求]]について[[モジュール指定子を解決]]した結果に設定します。
=== [53] [VAR[URL]] が[[失敗]]の場合、
==== [54] [VAR[エラー]]を、新しい [CODE[TypeError]] に設定します。
==== [55] [VAR[スクリプト]]と[VAR[エラー]]について、[[実現値化前エラーを設定]]します。
== [88] [VAR[スクリプト]]の[F[モジュール記録]]を、[VAR[結果]]に設定します。
= [147] [VAR[スクリプト]]を返します。
]FIG]

* 実行

[23] [[スクリプトの実行]]を参照。

* ごみ収集

[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>

[170] [CITE@en[Convert custom element callbacks to Web IDL callback types]]
([[domenic]]著, [TIME[2016-06-30 02:10:53 +09:00]])
<https://github.com/whatwg/html/commit/be055730a11a8f952feb8fdb73e7caa01460e5a4>

[171] [CITE@en[Handle reentrant custom element definition]]
([[domenic]]著, [TIME[2016-06-07 17:18:04 +09:00]])
<https://github.com/whatwg/html/commit/270b5f3e48411063c431fdf98dbe41766ddc20b1>

[172] [CITE@en[Add a new section detailing the various potential realms]]
([[domenic]]著, [TIME[2016-05-03 06:09:12 +09:00]])
<https://github.com/whatwg/html/commit/6399af334edd6000bd394685923df5f0519194ab>

[22] [CITE@en[Fix some callers of "create a module script"]]
([[domenic]]著, [TIME[2016-09-15 20:07:32 +09:00]])
<https://github.com/whatwg/html/commit/73af7511ab638a4fcb7a1db908ea746ad808344a>

[35] [CITE@en[Fix error cases of <script type=module>]]
([[domenic]]著, [TIME[2017-05-13 01:50:49 +09:00]])
<https://github.com/whatwg/html/commit/115763124a641e8814665c5014d28155f95ff441>

[36] [CITE@en[Improve module instantiation/evaluation, especially around errors]]
([[domenic]]著, [TIME[2017-08-04 05:13:45 +09:00]])
<https://github.com/whatwg/html/commit/2b408b65a11fe76b6588b744e0ae74d30ff29b43>

[45] [CITE@en[Improve module instantiation/evaluation, especially around errors]]
([[domenic]]著, [TIME[2017-08-04 05:13:45 +09:00]])
<https://github.com/whatwg/html/commit/2b408b65a11fe76b6588b744e0ae74d30ff29b43>

[56] [CITE@en[Editorial: refactor classic and module scripts to be more alike]]
([[domenic]]著, [TIME[2017-09-07 05:40:50 +09:00]])
<https://github.com/whatwg/html/commit/dce999aac4d9deeefa3b338dd2aeb30c17669bc8>

[81] [CITE@en[Editorial: refactor classic and module scripts to be more alike by domenic · Pull Request #2972 · whatwg/html]]
([TIME[2017-09-23 15:18:12 +09:00]])
<https://github.com/whatwg/html/pull/2972>

[82] [CITE@en[Editorial: move base URL from "module script" to "script"]]
([[domenic]]著, [TIME[2017-09-14 20:28:50 +09:00]])
<https://github.com/whatwg/html/commit/5458513792ab00d58e6c91ba48faaa611d034a2e>

[84] [CITE@en[Editorial: move base URL from "module script" to "script"]]
([[domenic]]著, [TIME[2017-09-14 20:28:50 +09:00]])
<https://github.com/whatwg/html/commit/5458513792ab00d58e6c91ba48faaa611d034a2e>

[85] [CITE@en[Make integrity="" work on module scripts]]
([[domenic]]著, [TIME[2017-09-14 18:00:24 +09:00]])
<https://github.com/whatwg/html/commit/9275d955dcd604e959cfcc672e0c234b1b8c00db>

[90] [CITE@en[Does integrity="" intentionally not work on module <script>s? · Issue #2382 · whatwg/html]]
([TIME[2017-10-05 14:17:11 +09:00]])
<https://github.com/whatwg/html/issues/2382>

[91] [CITE@en[Does integrity="" intentionally not work on module <script>s? · Issue #2382 · whatwg/html]]
([TIME[2017-10-05 14:17:22 +09:00]])
<https://github.com/whatwg/html/issues/2382>

[92] [CITE@en[Fix module script error handling, again]]
([[domenic]]著, [TIME[2017-08-31 06:25:49 +09:00]])
<https://github.com/whatwg/html/commit/165101a955652f715e551917c80ab8140429978f>

[93] [CITE@en[Fix module script error handling, again by domenic · Pull Request #2991 · whatwg/html]]
([TIME[2017-12-19 00:44:28 +09:00]])
<https://github.com/whatwg/html/pull/2991>

[95] [CITE@en[Do not remember module instantiation errors. by GeorgNeis · Pull Request #1006 · tc39/ecma262]]
([TIME[2017-12-19 00:51:37 +09:00]])
<https://github.com/tc39/ecma262/pull/1006>

[96] [CITE@en-US[Opera 50 Beta RC with Cryptocurrency Mining Protection - Opera Desktop]]
([TIME[2017-12-26 16:36:50 +09:00]])
<https://blogs.opera.com/desktop/2017/12/opera-50-beta-rc-cryptocurrency-mining-protection/>

[97] [CITE@en[Initialize script's base URL earlier]]
([[TimothyGu]]著, [TIME[2018-01-16 09:38:44 +09:00]])
<https://github.com/whatwg/html/commit/34ca9e5dcaaba10b22553d3235aaf7eca919d7ab>

[86] [CITE@en[Initialize script's base URL earlier by TimothyGu · Pull Request #3352 · whatwg/html]]
([TIME[2018-01-18 15:55:15 +09:00]])
<https://github.com/whatwg/html/pull/3352>