エラーがスローされた場合の Javascript の実行に関する重要な事実を学びました。これについて結論を出す前に、自分が正しいかどうかを確認したほうがよいでしょう。
2 つのスクリプトを含む HTML ページがあるとします。
<script src="script1.js" />
<script src="script2.js" />
スクリプト 1:
doSomething();
スクリプト 2:
doSomeOtherThing();
これにより、事実上、1 つのスクリプトが 1 つのユニットとして処理されます。
doSomething();
doSomeOtherThing();
特に、doSomething
エラーがスローされると、実行が中断されます。「script2」は実行されません。
これは私の「レッスン 1」です。これは別のインクルード ファイルであるため、script1 の影響を受けないと思われるかもしれません。しかし、そうです。 => 以下の「最新の更新」を参照してください
ここで、script2 を次のように変更するとします (上のどこかに jQuery が含まれていると仮定します)。
$(document).ready({ doSomeOtherThing(); });
script2 の前にスクリプトを配置します。
<script src="script2.js" />
<script src="script1.js" />
実行の順序は、事実上、「doSomething()」の後に (いつか)「doSomeOtherThing()」が続きます。
ただし、2 つの「ユニット」で実行されます。
doSomething
ドキュメントの Java スクリプトの一部として早期に実行されるdoSomeOtherThing
document.ready イベントが処理されるときに実行されます。
doSomeOtherThing
例外がスローされた場合、2 番目の処理「ユニット」は中断されません。
(この用語の使用は控えますthread
。通常、すべてのスクリプトは同じスレッドで実行されると考えているためです。より正確には、これはブラウザーに依存する可能性があります。)
したがって、私の教訓 2 : JavaScript エラーによって後続のスクリプトの実行が妨げられる場合がありますが、イベント ループは停止しません。
結論 1
$(document).ready()
成功するために他のスクリプトとは独立して実行する必要がある JavaScript コードのチャンクを定義するのに優れた仕事をします。
または、言い換えると、JavaScript の一部があり、他のスクリプトが失敗した場合でも確実に実行されるようにしたい場合は、$(document).ready()
.
これは、スクリプトがドキュメントが完全に読み込まれることに依存している場合にのみイベントを使用していたという点で、私にとっては新しいことです。
結論2
さらに一歩進んで、すべてのスクリプトが実行のために「キューに入れられる」ことを確認するために、すべてのスクリプトを 内にラップすることは、アーキテクチャ上の適切な決定である可能性があります。上記の 2 番目の例では、例 1$(document).ready()
のように ifが後script2.js
に含まれていました。 script1.js
<script src="script1.js" />
<script src="script2.js" />
script1.js にエラーがあると、関数が実行されないdoSomeOtherThing()
ため、 を登録することさえできません。$(document).ready()
ただし、script1.js$(document).ready()
も使用すると、それは起こりません。
$(document).ready(function() { doSomething(); });
$(document).ready(function() { doSomeOtherThing(); });
両方の行が実行されます。その後、イベント ループが実行doSomething
されて中断しますが、doSomeOtherThing
影響はありません。
そうするもう 1 つの理由は、ページをレンダリングするスレッドができるだけ早く戻ることができ、イベント ループを使用してコード実行をトリガーできることです。
批評 / 質問:
- 私は間違っていましたか?
- コードの一部をすぐに実行する必要がある、つまりイベントにラップしないことが必要な理由は何ですか?
- パフォーマンスに大きな影響を与えますか?
- ドキュメント準備完了イベントを使用するのではなく、同じことを達成するための別の/より良い方法はありますか?
- すべてのスクリプトがコードをイベント ハンドラーとして登録するだけの場合、スクリプトの実行順序を定義できますか? イベント ハンドラーは、登録された順序で実行されますか?
有益なコメントをお待ちしております!
遅い更新:
Briguy37 が正しく指摘したように、私の観察はそもそも間違っていたに違いありません。(「私は間違っていましたか-はい!」)。彼の簡単な例を取り上げると、すべての主要なブラウザーで再現でき、IE8 でさえ、script1 がエラーをスローしても script2 が実行されます。
それでも@Marcelloの素晴らしい答えは、実行スタックなどの概念について洞察を得るのに役立ちます。2つのスクリプトのそれぞれが別々の実行スタックで実行されるようです。