[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]] 版) ''' - [22] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) - [38] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) - [49] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) ]REFS] * 構成要素 [12] [DFN[[[スクリプト]]]]は次のものを有します [SRC[>>11]]。 [FIG[ - [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[ - [[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[ = [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] [[WebIDL]] も同様の操作を行うことになっていますが、現在まだ一世代前の「[[現職スクリプト]]」 を使った定義になっていて、[[現職設定群オブジェクト]]を使った定義にまだ更新されていません。 * 作成 [39] [DFN[[RUBYB[[[スクリプトの作成]]]@en[create a script]]]]は、 [[ワーカー]]と[[イベントハンドラー]]を除く[[スクリプト]]を作り、実行する時に呼ばれる手順です。 この手順は次のようにしなければ[['''なりません''']] [SRC[>>38]]。 [FIG[ = [41] 入力として与えられた[[閲覧文脈]]で[[スクリプトが無効]]なら、 [[void]] を返すだけのプログラムだった場合のようにし、これらの手順を終えます。 = [42] 入力として与えられた[[スクリプト設定群オブジェクト]]から、 入力として与えられた[[スクリプト言語]]の[[スクリプト実行環境]]を取得します。 = [43] >>42 の[[スクリプト実行環境]]を使って入力として与えられた[[ソース]]を[[構文解析]]、 [[コンパイル]]、[[初期化]]します。 = [46] 新しい[[スクリプト]]を作ります。 =- [47] [[コード入口点]]は >>43 の結果とします。 =- [44] [[設定群オブジェクト]]と[[エラーミュートフラグ]]は入力として与えられたものとします。 = [45] ここまで (特に >>43) に成功していれば、[[スクリプト]]の[[コード入口点に飛ぶ]]手順を実行します。 = [48] そうでなければ、[[エラーを報告]]します。 -- 入力として与えられた[[スクリプト設定群オブジェクト]]の[[大域スクリプト]]を対象として使います。 -- エラーが[[取り扱いされない]]なら、そのエラーを[[利用者]]に報告して[['''構いません''']]。 ]FIG] ;; [50] 「作成」という手順ですが、実行も含まれています。 * 実行制限と中断 [51] [[閲覧文脈]]は[[スクリプトが有効]]、[[スクリプトが無効]]の状態を有しており、 [[利用者エージェント]]の対応状況、[[利用者]]の設定、[[著者]]の指定によってどちらであるかが決定します。 [[スクリプトが無効]]の場合、[[スクリプト]]が作成されなかったり、[[スクリプト]]の実行が実際の内容に関わらず 「何もしない」となったり (>>28) します。詳しくは[[スクリプトが無効]]の項をご覧ください。 [54] [[スクリプト]]の実行中に[[スクリプト]]が無効になったときは、ただちに[[スクリプト]]を終端する[['''べきです''']] [SRC[>>49]]。 [52] [[利用者エージェント]]は、[[スクリプト]]に対して[[資源]]の制限を課して[['''構いません''']]。 例えば、[[CPU]] [[quota]]、[[メモリー]]の制限、合計実行時間の制限、[[帯域]]の制限などを課すことができます。 [SRC[>>49]] [53] [[スクリプト]]が制限を超えた時は、 [CODE(DOMc)@en[[[QuotaExceededError]]]] [[例外]]を[[投げる]]か、 [[例外]]なしで中断するか、[[利用者]]に確認するか、[[スクリプト]]の実行に[RUBYB[[[絞り弁]]]@en[throttele]]を適用するかして[['''構いません''']]。 [SRC[>>49]] * ごみ収集 [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]] [6] [[HTML 4]] の >>5 の規定は[[スクリプト]]が生成する [[HTML]] [[文書片]]の[[適合性]]に関する議論でしばしば引用されますが、 時期や内容からしても、 [[HTML 4]] はおそらく [[HTML]] [[文書]]全体にアクセス可能な現在の [[DOM]] を想定していません。 現実の [[Webブラウザ]]の処理モデルとも一致していませんし、 それほど価値がある引用だとは思えません。 * 歴史 [3] ([[HTML]] の) [[クライアント]]側[DFN[[RUBYB[スクリプト][script]]]]とは、 HTML 文書に添えられた、あるいは HTML 文書中に埋込まれた[[プログラム]]です。 このプログラムは文書が読込まれた時、あるいは[[連結]]が[[活性化]]された時などに、 クライアントの機械上で実行されます。 [[HTML 4]] [CITE[18.1 Introduction to scripts]] より * メモ [1] ''DynamicScripting'' [[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 ]] 著, [TIME[2008-12-23 03:41:08 +09:00]] 版) [8] [CITE[IRC logs: freenode / #whatwg / 20090325]] ([TIME[2009-05-16 17:57:49 +09:00]] 版) [[SVG]] における[[スクリプト]]実行モデル (と [[HTML]] の[[スクリプト]]実行モデル) に関する議論です。