古典スクリプト

スクリプト (Web)

[9] Web におけるスクリプト (script) は、 Webブラウザーで実行されるプログラム片です。 スクリプトには古典スクリプトモジュールスクリプトがあります。

目次

  1. 仕様書
  2. 分類
  3. 状態
  4. fetch
  5. 生成
  6. 実行
  7. ごみ収集
  8. マーク付けの適合性との関係
  9. 並行性・並列性
  10. 歴史
    1. HTML4
    2. HTML5
      1. コード入口点
      2. スクリプトの作成
    3. HTML 2016

仕様書#

分類#

[118] スクリプトには、古典スクリプト (classic script) モジュールスクリプトがあります >>11

[159] JavaScript では両者をそれぞれスクリプトモジュールと呼んでいます >>158HTML の用語 (>>118) は、どちらも script 要素を通じて利用することによります >>158

[163] script 要素スクリプトの型 (the script's type) を持ちます。 初期状態では未設定です。値は classicmodule です。 >>162

<script type> も参照。

[99] WorkerGlobalScope には (type) があり、 その値は classicmodule のいずれかです。 >>98 それぞれ古典スクリプトモジュールスクリプトを表します。

[25] サービスワーカーは、 (type) を持ちます。 その値は classicmodule のいずれかです。 初期値は classic です。 >>24 それぞれ古典スクリプトモジュールスクリプトを表します。

[34] ジョブは、ワーカー型 (worker type) を持ちます >>33。その値は classicmodule のいずれかです >>33

[155] ワーカーの作成時には、 WorkerOptions 辞書type メンバー >>100ServiceWorkerOptions 辞書type メンバー >>32 の値により、 古典スクリプトワーカースクリプトのいずれかを指定できます。 値は WorkerType >>100, >>32、すなわち classicmodule のいずれか >>156 です。 type 省略時の既定値は classic です >>100, >>32

[160] 古典スクリプトモジュールスクリプト
JavaScript 用語スクリプトモジュール
HTML 用語古典スクリプトモジュールスクリプト
script 要素<script></script><script type=module></script>
スクリプトの型classicmodule
WorkerTypeclassicmodule
Workernew Worker (..., {})new Worker (..., {type: "module"})
SharedWorkernew SharedWorker (..., {})new SharedWorker (..., {type: "module"})
ServiceWorkernavigator.serviceWorker.register (..., {type: "classic"})navigator.serviceWorker.register (..., {type: "module"})
document.currentScript×

状態#

[12] スクリプト (script) >>11 は、 次の状態を持ちます。

[83] スクリプトの持つ状態
[17] 設定群オブジェクト (settings object)
スクリプト設定群オブジェクト。 同じ文脈の他のスクリプトと共有している設定諸々です。 >>11 [18] 強い参照です >>64
記録 (record)
古典スクリプトの場合はスクリプト記録モジュールスクリプトの場合はソーステキストモジュール記録。 あるいは構文解析誤りが値を持つ場合、 null>>11
構文解析誤り (parse error)
JavaScript値>>11
再び投げるエラー (error to rethrow)
JavaScript値>>11
基底URL
モジュール指定子を解決する時に使う基底URLです。 外部スクリプトではスクリプトを取得した URL で、 文書中のスクリプトでは文書基底URLです。 >>11
fetchオプション群
スクリプトfetchオプション群 >>11

[120] 古典スクリプトは次の状態をも持ちます。

[15] エラーミュート (muted errors) フラグ
設定されている場合には、 このスクリプトエラーにはエラー情報を提供しません。 >>11 [16] 起源が異なるスクリプトについてのエラーから私的な情報が流出する虞があるので、 これを抑制するために使います。 >>11
元の資源絶対URL
エラーの報告で使われます。
ソーステキスト (source text)
JavaScript Script として評価されることになる、 実行可能なコードのブロックを含む文字列 >>11更新時にバイト列として比較されることがあります。 記録に統合されました。

[122] モジュールスクリプトは、次の状態をも持ちます。

[37] モジュールスクリプトの持つ状態
状態
スクリプトの読み込みの状態を表します。
モジュール記録
記録に統合されました。
実現値化前エラー (pre-instantiation error)
スクリプトの読み込みの失敗を説明する値です。 構文解析誤りに統合されました。
credentials mode
輸入されたモジュールfetch するのに使う credentials mode です >>11fetchオプション群に統合されました。
暗号学的nonce
モジュールスクリプトのfetchの際の nonce の検査に使う文字列です。 fetchオプション群に統合されました。
構文解析器状態
モジュールスクリプトのfetchの際の構文解析器メタデータとして使う値です。 fetchオプション群に統合されました。
エラーである
エラー
実現値化されている

[26] サービスワーカーは、 スクリプト資源 (script resource) を持ちます。 値はスクリプトまたは null です。初期値は null です。 >>30

[31] スクリプト資源は、 (null でないときに) 次の状態を持ちます。

has ever been evaluated flag
初期値は未設定>>30 サービスワーカーを走らせる処理で利用されます。
HTTPS状態
サービスワーカーを走らせる処理で利用されます。
参照元ポリシー
サービスワーカーを走らせる処理で利用されます。

[161] スクリプトは、次のような一連の処理によって実行されます。

  1. script 要素の挿入またはワーカー構築子の呼び出し
  2. fetch (外部スクリプトの場合)
  3. 作成
  4. 実行

fetch#

[157] スクリプトのfetchも参照。

生成#

[10] スクリプトは次の方法で生成することができます。

[69] スクリプトの作成手段

[27] イベントハンドラー (getting the current value of the event handler) HTML Standard も以前はスクリプトを使っていましたが、現在はスクリプトではなく、 単なる JavaScriptFunction として定義されています。

[40] 仕様書が存在しませんが、歴史的には次のものもありました。

[66] この他に、ブラウザー拡張WebDriver などによってスクリプトが注入されることもあり得ます。 (それがここでいうスクリプトなのかどうかは謎です。それぞれのアーキテクチャ次第で動作が異なるかもしれません。)

[65] eval文字列引数の Function は、 ここでいうスクリプトを作るものではありません。
[67] Webブラウザーが実行するスクリプトであっても、 ここでいうスクリプトとは処理方法が異なるものもあります。 例えば PACJavaScript はまったく異なる方法と環境で実行されます。

[124] 古典スクリプトの作成 (create a classic script) は、 ソーステキスト設定群エラーミュートフラグ (既定値)、 オプション群基底URLについて、 次のようにします >>38

  1. [71] スクリプトを、新しい古典スクリプトに設定します。
    [68] 古典スクリプト
    設定群オブジェクト
    設定群
    エラーミュートフラグ
    エラーミュートフラグ
    構文解析エラー
    null
    再び投げるエラー
    null
    基底URL
    基底URL
    fetchオプション群
    オプション群
  2. [130] 設定群有責閲覧文脈スクリプトが無効の場合、
    1. [131] ソーステキストを、空文字列に設定します。
  3. [63] 結果は、ソーステキスト設定群Realmスクリプトについて ParseScript を実行した結果に設定します。
  4. [76] 結果エラーリストの場合、
    1. [77] スクリプト構文解析エラーを、 結果 [ 0 ] に設定します。
    2. [94] スクリプト再び投げるエラーを、 結果 [ 0 ] に設定します。
  5. [78] それ以外の場合、
    1. [79] スクリプト記録を、結果に設定します。
  6. [80] スクリプトを返します。

[127] モジュールスクリプトの作成 (create a module script) は、 ソーステキスト設定群スクリプト基底URLオプション群について次のようにしなければなりません >>38

  1. [129] スクリプトを、新しいモジュールスクリプトに設定します。
    [48] モジュールスクリプト
    モジュール記録
    null
    設定群オブジェクト
    設定群
    構文解析エラー
    null
    再び投げるエラー
    null
    基底URL
    スクリプト基底URL
    fetchオプション群
    オプション群
  2. [134] 設定群有責閲覧文脈スクリプトが無効の場合、
    1. [135] ソーステキストを、空文字列に設定します。
  3. [139] 結果を、 ParseModule(ソーステキスト, 設定群Realm, スクリプト) に設定します。
  4. [140] 結果エラーリストの場合、
    1. [141] スクリプト構文解析エラーを、 結果 [ 0 ] に設定します。
  5. [143] それ以外の場合、
    1. [49] 記録RequestedModules の各被要求について、順に、
      1. [52] URL を、 スクリプト基底URL被要求についてモジュール指定子を解決した結果に設定します。
      2. [53] URL失敗の場合、
        1. [54] エラーを、新しい TypeError に設定します。
        2. [55] スクリプトエラーについて、実現値化前エラーを設定します。
    2. [88] スクリプトモジュール記録を、結果に設定します。
  6. [147] スクリプトを返します。

実行#

[23] スクリプトの実行を参照。

ごみ収集#

[20] スクリプトは、イベントハンドラーとして用いられるものを除けば >>10 のいずれもその場で作られ、 実行され、スクリプトへの参照は残らないので、実行が終わり次第ごみ収集されることになります。

[21] イベントハンドラーについては作られた後何度も実行され得るので、他のイベントハンドラーに置き換えられるなり、 EventTarget もろともごみ収集されるなりするまで、ごみ収集されずに残ることになります。

マーク付けの適合性との関係#

本項は古くなっています。

[5] HTML文書は、 script の処理の前後いずれにおいても、 HTML DTD適合しなければなりません。 HTML4 18.2.4

[4] 仕様書:

[6] HTML 4>>5 の規定はスクリプトが生成する HTML 文書片適合性に関する議論でしばしば引用されますが、 時期や内容からしても、 HTML 4 はおそらく HTML 文書全体にアクセス可能な現在の DOM を想定していません。 現実の Webブラウザの処理モデルとも一致していませんし、 それほど価値がある引用だとは思えません。

並行性・並列性#

[57] 著者から観測可能な範囲において、複数のスクリプトが同時に実行される(ように見える)ことはありません。 スクリプト著者は、マルチスレッドのプログラミングのように複雑な排他制御などを考える必要はありません。

[58] showModalDialog のようにタスクが途中で中断され、 後に再開される場合など、特殊な場合においてスクリプトが複数同時に動作するように思えることがありますが、 ある時点で処理を進められる状態にあるスクリプトは必ず1つだけです。
[59] ワーカーや異なる起源スクリプトなど、 postMessage などによってのみ情報伝達が可能なスクリプト同士は、複数同時に動作している可能性がありますが、 本当に複数同時に実行されているのか、順番に実行されているのか直接的に知る方法はありませんし、 互いのデータに直接的にアクセスする手段もありません。

[60] 詳しくはイベントループの項を参照してください。

歴史#

HTML4#

[3] (HTML の) クライアントスクリプト (script) とは、 HTML 文書に添えられた、あるいは HTML 文書中に埋込まれたプログラムです。 このプログラムは文書が読込まれた時、あるいは連結活性化された時などに、 クライアントの機械上で実行されます。

[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 は歴史上初めてスクリプトの詳細な処理モデルを明文化しました。 更に script 要素async 属性ワーカーなどの新機能を導入しました。

[7] Code defined for one document called after that document is no longer the one being displayed (Ian Hickson <ian@...> 著, 版) <http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/17268>

[8] IRC logs: freenode / #whatwg / 20090325 ( 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20090325>

SVG におけるスクリプト実行モデル (と HTMLスクリプト実行モデル) に関する議論です。

[61] The "initialization" steps for Web browsers ( ( 版)) <https://mail.mozilla.org/pipermail/es-discuss/2014-July/038399.html>

[62] >>2スクリプトスクリプト設定群オブジェクト環境設定群オブジェクトに改称されています。

[119] 2016年1月のモジュール導入までは、古典スクリプトスクリプトと呼ばれていました >>117

コード入口点#

[121] 古典スクリプトソーステキストは、 当時はスクリプトコード入口点として定義されていました。

[13] スクリプトコード入口点 (code entry-point) は、 実行可能コードブロックを含むものとして評価されることとなる文字列、 または JavaScript関数オブジェクトのいずれかです。 >>11

[72] かつては次のように一般的に規定されていましたが、 JavaScript 以外の言語への対応は削除されました。

[73] スクリプトが他のスクリプト利用者エージェントに晒す、 実行可能コードブロック。一般的にはコード入口点に対応するコードスクリプト構文解析された直後に実行されますが、 イベントハンドラーの場合は呼び出される度に実行されます。

[14] JavaScriptscript ブロックの場合には、大域コード実行文脈に対応します。

[74] コード入口点は、イベントハンドラーの場合関数のこともありますが、 多くの場合は文字列です。文字列JavaScript として評価した結果、 正しい JavaScriptスクリプトであることもあれば、 構文エラーなどが含まれる場合もあります。

[19] コード入口点は、実行すると値を返したり、例外を投げたりします。 返された値は、呼び出し元で使われることがあります。 例外は、呼び出し元で適宜処理されます。

スクリプトの作成#

[123] モジュール導入以前は、古典スクリプトの作成と実行に相当するのはスクリプトの作成という手順でした。

[39] スクリプトの作成 (create a script) >>38は、 ワーカーイベントハンドラーを除くスクリプトを作り、実行する時に呼ばれる手順です。 次の引数があります。

スクリプトのソース
スクリプトソースコードとして使われる文字列
スクリプトのソースの URL
環境設定群オブジェクト
環境設定群オブジェクト
エラーミュート (muted errors) フラグ
エラーを再度投げる (rethrow errors) フラグ
閲覧文脈

[105] 次のようにしなければなりません >>38

  1. [41] 閲覧文脈スクリプトが無効なら、ここで停止します。
  2. [46] スクリプトを、新しいスクリプトに設定します。
    スクリプト
    [47] コード入口点
    スクリプトのソース
    [44] 設定群オブジェクト
    環境設定群オブジェクト
    エラーミュートフラグ
    エラーミュートフラグ
  3. [42] スクリプトコード入口点に飛ぶ処理を実行します。 エラーを再度投げるフラグを引き継ぎます。
[50] 「作成」という手順ですが、実行も含まれています。

HTML 2016#

[149] 2015年後半から2016年にかけて、スクリプトに関する規定の整理とモジュールの導入などの大改訂が行われています。

[70] Add promise rejection tracking events · whatwg/html@61ccc05 ( 版) <https://github.com/whatwg/html/commit/61ccc05b7437ba947390928f9e526da49550fed0>

[75] Rewrite script execution on top of ES · whatwg/html@4891d18 ( 版) <https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>

[43] Fix importScripts() script execution · whatwg/html@704907d ( 版) <https://github.com/whatwg/html/commit/704907dc195e77759fb7b48e51932094d150b7fc>

[117] Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb ( 版) <https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4>

[28] Use "credentials mode" instead of "CORS setting" for modules · whatwg/html@7a0ce07 ( 版) <https://github.com/whatwg/html/commit/7a0ce073a8fbade8f44d0e2d4c709ad7cf3ee312>

[29] Add module workers · whatwg/html@e3a5bb7 ( 版) <https://github.com/whatwg/html/commit/e3a5bb757f64374c37d8c4528c01298463ef0b2a>

[51] Fix #715: clarify how aborting a running script works · whatwg/html@6a48bfb ( 版) <https://github.com/whatwg/html/commit/6a48bfbf1066034eab4786d62ba4017593c48430>

[166] Clarify settings object, realm, and global relationships · whatwg/html@0866f1b ( 版) <https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>

[167] Pass cryptographic nonce metadata to Fetch · whatwg/html@5479e07 ( 版) <https://github.com/whatwg/html/commit/5479e07a6f6e01062b85b5fe6799752b0370336c>

[145] Detail how javascript: return values become response bodies · whatwg/html@9997cd9 ( 版) <https://github.com/whatwg/html/commit/9997cd93c65a9f4a640a593c02f01c2c58924457>

[168] Should we be doing prepare to run a script/clean up after running a script more often? · Issue #855 · whatwg/html () <https://github.com/whatwg/html/issues/855>

[169] Editorial: fix typo in running a module script (domenic著, ) <https://github.com/whatwg/html/commit/4b9a96849c4a9a78c8cae9febe5eeb08182ce7e0>

[170] Convert custom element callbacks to Web IDL callback types (domenic著, ) <https://github.com/whatwg/html/commit/be055730a11a8f952feb8fdb73e7caa01460e5a4>

[171] Handle reentrant custom element definition (domenic著, ) <https://github.com/whatwg/html/commit/270b5f3e48411063c431fdf98dbe41766ddc20b1>

[172] Add a new section detailing the various potential realms (domenic著, ) <https://github.com/whatwg/html/commit/6399af334edd6000bd394685923df5f0519194ab>

[22] Fix some callers of "create a module script" (domenic著, ) <https://github.com/whatwg/html/commit/73af7511ab638a4fcb7a1db908ea746ad808344a>

[35] Fix error cases of <script type=module> (domenic著, ) <https://github.com/whatwg/html/commit/115763124a641e8814665c5014d28155f95ff441>

[36] Improve module instantiation/evaluation, especially around errors (domenic著, ) <https://github.com/whatwg/html/commit/2b408b65a11fe76b6588b744e0ae74d30ff29b43>

[45] Improve module instantiation/evaluation, especially around errors (domenic著, ) <https://github.com/whatwg/html/commit/2b408b65a11fe76b6588b744e0ae74d30ff29b43>

[56] Editorial: refactor classic and module scripts to be more alike (domenic著, ) <https://github.com/whatwg/html/commit/dce999aac4d9deeefa3b338dd2aeb30c17669bc8>

[81] Editorial: refactor classic and module scripts to be more alike by domenic · Pull Request #2972 · whatwg/html () <https://github.com/whatwg/html/pull/2972>

[82] Editorial: move base URL from "module script" to "script" (domenic著, ) <https://github.com/whatwg/html/commit/5458513792ab00d58e6c91ba48faaa611d034a2e>

[84] Editorial: move base URL from "module script" to "script" (domenic著, ) <https://github.com/whatwg/html/commit/5458513792ab00d58e6c91ba48faaa611d034a2e>

[85] Make integrity="" work on module scripts (domenic著, ) <https://github.com/whatwg/html/commit/9275d955dcd604e959cfcc672e0c234b1b8c00db>

[90] Does integrity="" intentionally not work on module <script>s? · Issue #2382 · whatwg/html () <https://github.com/whatwg/html/issues/2382>

[91] Does integrity="" intentionally not work on module <script>s? · Issue #2382 · whatwg/html () <https://github.com/whatwg/html/issues/2382>

[92] Fix module script error handling, again (domenic著, ) <https://github.com/whatwg/html/commit/165101a955652f715e551917c80ab8140429978f>

[93] Fix module script error handling, again by domenic · Pull Request #2991 · whatwg/html () <https://github.com/whatwg/html/pull/2991>

[95] Do not remember module instantiation errors. by GeorgNeis · Pull Request #1006 · tc39/ecma262 () <https://github.com/tc39/ecma262/pull/1006>

[96] Opera 50 Beta RC with Cryptocurrency Mining Protection - Opera Desktop () <https://blogs.opera.com/desktop/2017/12/opera-50-beta-rc-cryptocurrency-mining-protection/>

[97] Initialize script's base URL earlier (TimothyGu著, ) <https://github.com/whatwg/html/commit/34ca9e5dcaaba10b22553d3235aaf7eca919d7ab>

[86] Initialize script's base URL earlier by TimothyGu · Pull Request #3352 · whatwg/html () <https://github.com/whatwg/html/pull/3352>