コールバックを走らせた後の片付け

スクリプト、コールバックの実行 (Web)

[134] Web において実行されるものには、いくつかの種類があります。

仕様書

古典スクリプトの実行

[23] 古典スクリプトの実行 (run a classic script) >>22 (旧コード入口点に飛ぶ (jump to a code entry-point) ) は、次の引数を持つ手続きです。

スクリプト
古典スクリプト
エラーを再度投げる (rethrow errors) フラグ
例外が投げられた時に、それを呼び出し元のスクリプトに伝播させるべきかどうかを指定します。 基本的にはで、例外例外の報告へと回されますが、 importScripts では呼び出し元に引き渡されます。 既定値です >>22

[45] 次のようにします >>22

  1. [78] 設定群を、スクリプト設定群オブジェクトに設定します。
  2. [150] 設定群についてスクリプトを実行できるか検査した結果が「実行しない」の場合、
    1. [146] NormalCompletion を適用した結果を返し、ここで停止します。
  3. [151] 設定群についてスクリプトを実行する準備をします。
  4. [24] スクリプト再び投げるエラーnull の場合、
    1. [156] 評価状態を、 スクリプト記録について ScriptEvaluation した結果に設定します。 走っているスクリプトの中断があった場合には、 評価状態null に設定します。
  5. [157] それ以外の場合、
    1. [25] 評価状態を、新しい Completion に設定します。
      [82] Completion
      Type
      throw
      Value
      スクリプト再び投げるエラー
      Target
  6. [52] 評価状態abrupt completion の場合、
    1. [84] エラーを再度投げるの場合、
      1. [26] 設定群についてスクリプトを走らせた後の片付けをします。
      2. [155] スクリプトエラーミュートフラグがの場合、
        1. [108] NetworkError DOMException投げます。
      3. [158] それ以外の場合、
        1. [85] 評価状態Value再び投げます。
    2. [87] それ以外の場合、
      1. [56] スクリプト評価状態Valueについて例外を報告します。
      2. [86] 設定群についてスクリプトを走らせた後の片付けをします。
      3. [53] 評価状態を返します。
  7. [160] それ以外の場合、
    1. [54] 設定群についてスクリプトを走らせた後の片付けをします。
    2. [63] 評価状態normal completion の場合、
      1. [81] 評価状態を返します。
    3. [83] それ以外の場合、
      1. [106] 新しい Completion を返します。
        [169] Completion
        throw
        新しい QuotaExceededErro DOMException
        Target
        empty
[79] この手続きが返す値が使われるのは、 javascript: URL の実行の時とサービスワーカーだけのようです。

[135] 古典スクリプトの実行は、古典スクリプトの作成の後、適当なタイミングで行われます。

モジュールスクリプトの実行

[80] モジュールスクリプトスクリプトboolean エラーを再び投げる (既定値) についてモジュールスクリプトを実行 (run a module script) するとは、 次のようにしなければなりません >>22

  1. [90] 設定群オブジェクトを、スクリプト設定群オブジェクトに設定します。
  2. [91] 設定群オブジェクトについてスクリプトを実行できるか検査した結果が「実行しない」なら、
    1. [138] NormalCompletion を適用した結果を返し、 ここで停止します。
  3. [113] 設定群オブジェクトについてスクリプトを実行する準備をします。
  4. [139] スクリプト再び投げるエラーnull の場合、
    1. [92] 記録を、スクリプト記録に設定します。
    2. [114] 評価状態を、 記録Evaluation を実行した結果に設定します。 走っているスクリプトの中断があった場合には、 評価状態を、新しい Completion に設定します。
      [109] Completion
      Type
      throw
      Value
      新しい QuotaExceededError DOMException
      Target
  5. [107] それ以外の場合、
    1. [88] 評価状態を、新しい Completion に設定します。
      [89] Completion
      Type
      throw
      Value
      スクリプト再び投げるエラー
      Target
    2. [115] 評価状態abrupt completion の場合、
    3. [141] エラーを再び投げるの場合、
      1. [152] 評価状態Value再び投げます。
    4. [159] それ以外の場合、
      1. [101] スクリプト評価状態Valueについて、例外を報告します。
  6. [153] 設定群オブジェクトについてスクリプトを走らせた後の片付けをします。
  7. [170] 評価状態を返します。

コールバック関数の実行

[3] コールバック関数呼び出し (invoke) >>303 は、 次の引数に関する操作です。

呼び出し可能
コールバック関数として使用する、コールバック関数型の値。
this
コールバック関数this として使う値。 既定値undefined >>303
引数リスト
コールバック関数引数リスト。 各値は、IDL値か、省略を表す特殊値「なし (missing) 」のいずれかです >>303

[4] 次のようにします >>303

  1. [17] F を、呼び出し可能JavaScript オブジェクトに設定します。
  2. [18] FIsCallable を適用した結果がなら、
    1. [7] 呼び出し可能返り型void なら、
      1. [10] ここで停止します。
    2. [13] それ以外なら、
      1. [15] undefined呼び出し可能返り型変換した結果を返し、ここで停止します。
  3. [5] realm を、 FRealmに設定します。
  4. [16] 関連設定群を、 realm設定群オブジェクトに設定します。
  5. [19] 蓄積設定群を、コールバック文脈に設定します。
  6. [20] 関連設定群についてスクリプトを走らせる準備を実行します。
  7. [21] 蓄積設定群についてコールバック実行の準備を実行します。
  8. [42] リストを、空のリストに設定します。
  9. [59] を、 0 に設定します。
  10. [60] 引数リストの各値について、順に、
    1. [27] が「なし」なら、
      1. [28] リストの末尾に undefined を追加します。
    2. [29] それ以外なら、
      1. [31] 結果を、JavaScript変換した結果に設定します。
      2. [32] 結果abrupt completion なら、
        1. [33] >>43 に飛びます。
      3. [34] それ以外なら、
        1. [35] リストの末尾に結果を追加します。
      4. [37] インクリメントします。
  11. [38] リストの末尾の値を削除して要素数がとなるようにします。
  12. [39] 結果を、Call(F, this, リスト) の結果に設定します。
  13. [40] 結果abrupt completion 以外なら、
    1. [41] 結果を、結果呼び出し可能返り型変換した結果に設定します。
  14. [57] 蓄積設定群についてコールバックを走らせた後の片付けを実行します。
  15. [43] 関連設定群についてスクリプトを走らせた後の片付けを実行します。
  16. [44] 結果abrupt completion なら、
    1. [47] 呼び出し可能返り型約束型なら、
      1. [50] 結果を、%Promise%.reject初期値を呼び出した結果に設定します。
        this
        %Promise%
        引数リスト
        1. 結果
      2. [51] 結果返り型変換した結果を返します。
    2. [48] それ以外なら、
      1. [49] 結果を返します。
  17. [45] それ以外なら、
    1. [46] 結果を返します。

[9] つまりコールバック関数を実行するものですが、 JavaScriptWeb IDL の値の変換、 JavaScript実行文脈スタックの操作、 例外Promise 化を適宜処理するものです。

[11] Call の呼び出しは、 途中で走っているスクリプトの実行中断が発生することがあります。

[58] 似たような処理が利用者オブジェクトについても規定されています。

[61] コールバック関数の呼び出しは、次の場面で行われます。

[8] Geolocation APIコールバックgetAsStringコールバックRTCPeerConnectionコールバックrequestIdleCallbackコールバックNSResolver でも同様の処理を挟む必要がありそうですが、 明文化されていません。

[14] カスタム要素構築器 (CustomElementConstructor) は、要素の格上げで呼び出されます。 他のコールバックとは違った処理となっています。

[136] モジュールスクリプトの実行は、モジュールスクリプトの作成の後、適当なタイミングで行われます。

コールバックインターフェイスの処理の実行

[112] 演算:

約束コールバックの実行

[118] 抽象操作 EnqueueJobマイクロタスクは、 ジョブ設定群現職設定群jobargumentsスクリプト実行文脈について次のようにしなければなりません >>276

  1. [119] ジョブ設定群に関してスクリプトを実行できるか検査した結果が「実行しない」なら、
    1. [120] ここで停止します。
  2. [121] ジョブ設定群についてスクリプト実行の準備をします。
  3. [122] 現職設定群についてコールバック実行の準備をします。
  4. [161] スクリプト実行文脈を、 JavaScript実行文脈スタックpush します。
  5. [123] 結果を、job で指定された抽象操作を実行した結果に設定します。arguments の各要素引数とします。
  6. [162] JavaScript実行文脈からスクリプト実行文脈pop します。
  7. [124] 現職設定群に関してコールバックを走らせた後の片付けをします。
  8. [125] ジョブ設定群に関してスクリプトを走らせた後の片付けをします。
  9. [126] 結果abrupt completion なら、
    1. [127] 結果Valueについて例外を報告します。

[117] これは実際には EnqueueJob された約束ジョブ (PromiseJobs ジョブキュージョブ) の実行でのみ使われます。約束コールバックを実行の場合、 jobPromise解決拒絶コールバックの実行に当たります。

[133] 指定された抽象操作は、走っているスクリプトの実行中断で途中で中断される可能性もあります。

[128] NextJob result は、次のようにしなければなりません >>276

  1. [129] resultabrupt completion なら、
    1. [130] result.value例外を報告します。
[131] これは ECMAScript 仕様書と異なる HTML Standard 独自のアルゴリズムで、 意図的違反とされています。
[132] つまり Promiseコールバックで発生した例外は、 例外の報告で処理されます。

準備と後片付け

[94] 環境設定群オブジェクト設定群オブジェクトについてのスクリプトを走らせる準備 (prepare to run script) は、 次のようにします >>22

  1. [97] JavaScript実行文脈スタックに、 設定群オブジェクトrealm実行文脈積みます。 (新たな走っているJavaScript実行文脈となります。)

[95] 環境設定群オブジェクト設定群オブジェクトについてスクリプトを走らせた後の片付け (clean up after running a script) は、 次のようにします >>22

  1. [30] 設定群オブジェクトrealm実行文脈JavaScript実行文脈スタックから削除します。
  2. [32] JavaScript実行文脈スタックが空なら、
    1. [103] マイクロタスクチェックポイントを行います。

[102] かつては大域スクリプト片付けジョブを走らせますの処理も行われていました。

[65] コールバックを走らせる準備 (prepare to run a callback) は、 環境設定群オブジェクト設定群について、次のようにします >>62

  1. [66] 設定群を、イベントループバックアップ現職設定群オブジェクトスタックpush します。
  2. [67] 文脈を、最上スクリプト持ち実行文脈に設定します。
  3. [64] 文脈null 以外なら、
    1. [69] 文脈現職決定時に飛ばす計数器インクリメントします。

[70] コールバックを走らせた後の片付け (clean up after running a callback) は、 環境設定群オブジェクト設定群について、次のようにします >>62

  1. [72] 文脈を、最上スクリプト持ち実行文脈に設定します。
  2. [73] 文脈null でなければ、
    1. [74] 文脈現職決定時に飛ばす計数器デクリメントします。
  3. [75] イベントループバックアップ現職設定群オブジェクトスタックから設定群を削除します。 (スタックの最上にあるはずです。)

[100] これらの処理は、次の場面で呼び出されます。

[105] ☆は、スクリプトの準備と片付けのみ行います。 それ以外は、スクリプトコールバックの準備と片付けの両方を行います。 両方を行う場合であっても、使用する設定群は異なることがあります。

[98] スクリプトコールバックの実行に関する処理は幾度もの改訂を経ており、 処理内容も用語も大きく変化しています。

[154] かつては、後のスクリプトを走らせる準備スクリプトを実行できるか検査とを合わせてコールバックを走らせる準備 (prepare to run a callback) と呼んでいました。 スクリプトを走らせた後の片付けは、 コールバックを走らせた後の片付け (clean up after running a callback) と呼ばれていました。 (これらは現在のコールバックの準備と片付けとは別物でした。)

[104] JavaScript実行文脈スタックスクリプト設定群オブジェクトのスタックが統合される前は、次のように規定されていました。

[35] JavaScriptSourceElements が評価される時には、 それに対応するスクリプト設定群オブジェクトを評価の直前にスクリプト設定群オブジェクトのスタックpush し、直後に pop しなければなりません >>22

[37] ES5 では SourceElementsプログラムの全体と、関数の中身で使われています。 ES6 では SourceElements がなくなってしまっています。

[36] コールバック関数の呼び出しと似ていますが、いくつか違いがあります。

[55] >>25 では実行時エラーが発生したり、例外catch されなかったりすることがあります。 この場合の挙動はエラーの報告の項をご覧ください。

[165] JavaScriptエンジン走っているスクリプト (running script) は、 走っているJavaScript実行文脈ScriptOrModuleHostDefined の値であるスクリプトです >>164

実行制限と中断

[49] スクリプトの中断を参照。

歴史

[2] スクリプトコールバック関数も参照。

[137] Handle error cases during module script tree fetching/running better (domenic著, ) https://github.com/whatwg/html/commit/e1af86747f591e33fd0f3f21f301dc866868c9d4

[93] Make quality an explicit argument for canvas image conversion (domenic著, ) https://github.com/whatwg/html/commit/7d25c4c2452b705220417ffb951c9b89e04ba50b

[110] An exception is not always an object (e.g., throw 7) (annevk著, ) https://github.com/whatwg/html/commit/6f32dc2cdbde1991dfa8ba2bf79a2eebe18324cd

[111] Editorial: integrate more explicitly with IDL for callbacks (annevk著, ) https://github.com/whatwg/dom/commit/8906b74be70c008757a5ef4f58455908bfcab200

[142] Remove global script clean-up jobs (mkruisselbrink著, ) https://github.com/whatwg/html/commit/305aa6705e2ae65ae8a407c53316359dfe286eba

[143] Clarify the setting of scripts' [[HostDefined]] (domenic著, ) https://github.com/whatwg/html/commit/9b4d858a14bf39aec5624a12f1bb598cb63385aa

[144] Simplify the definition of the "entry" concept (domenic著, ) https://github.com/whatwg/html/commit/36d771a0c90c3534fe0d4c6a23ca240979b94dfd

[1] Do not attempt to instantiate modules that have previously failed (domenic著, ) https://github.com/whatwg/html/commit/df58a1c6b10739f12efbd80f7fb6205fda0a59ed

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

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

[116] Circular module graphs instantiate too early · Issue #2629 · whatwg/html () https://github.com/whatwg/html/issues/2629

[147] Module script errors maybe shouldn't propagate to descendant scripts so much · Issue #2630 · whatwg/html () https://github.com/whatwg/html/issues/2630

[148] Rely on the JavaScript spec to handle more module errors by domenic · Pull Request #2674 · whatwg/html () https://github.com/whatwg/html/pull/2674

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

[140] Integrate dynamic import() (domenic著, ) https://github.com/whatwg/html/commit/d4d1704f9c0efbeed78b885d566af17545b8b5fe

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

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

[167] Proposal: self.queueMicrotask(f) · Issue #512 · whatwg/html () https://github.com/whatwg/html/issues/512

[168] Return the completion record result from running a script (mattto著, ) https://github.com/whatwg/html/commit/ad3dda51552aeeeea60540c7f1b513fe45b486a5

[171] Return the completion record result from running a script. by mattto · Pull Request #3888 · whatwg/html () https://github.com/whatwg/html/pull/3888

[172] Align "uncaught runtime script error" with the HTML spec · Issue #1334 · w3c/ServiceWorker () https://github.com/w3c/ServiceWorker/issues/1334

[173] Return empty on "do not run" for running a script (mattto著, ) https://github.com/whatwg/html/commit/b71f885ec4f6e1a074157036d3deb9f1d6a9aa77

[174] Return empty on "do not run" for running a script. by mattto · Pull Request #3907 · whatwg/html () https://github.com/whatwg/html/pull/3907

[175] Clarify "uncaught runtime script error". by mattto · Pull Request #1346 · w3c/ServiceWorker () https://github.com/w3c/ServiceWorker/pull/1346

[176] Clarify "uncaught runtime script error". (#1346) (mattto著, ) https://github.com/w3c/ServiceWorker/commit/595e504219f83300e2294dfa38e1e364882a0cf7

[177] Clarify "uncaught runtime script error". by mattto · Pull Request #1346 · w3c/ServiceWorker () https://github.com/w3c/ServiceWorker/pull/1346

[178] Clarify "uncaught runtime script error". by mattto · Pull Request #1346 · w3c/ServiceWorker () https://github.com/w3c/ServiceWorker/pull/1346

[179] Align "uncaught runtime script error" with the HTML spec · Issue #1334 · w3c/ServiceWorker () https://github.com/w3c/ServiceWorker/issues/1334