明示的に終了するコードを挿入したくない場合は、条件付きブレークポイントを使用してみてください。Firebug のスクリプト コンソールを開き、コードの横のガターを右クリックすると、ブレークポイントが挿入され、ブレークポイントが何らかの条件を満たしていることをトリガーするオプションが提供されます。たとえば、コードが次の場合:
var intMaxIterations = 10000;
var go = function() {
while(intMaxInterations > 0) {
/*DO SOMETHING*/
intMaxIterations--;
}
};
... ループの 10,000 回の繰り返しがすべて終了するのを待つか、条件付きブレークポイントをループ内のどこかに配置して condition を指定することができますintMaxIterations < 9000
。これにより、ループ内のコードを 1000 回 (実際には 1001 回) 実行できます。その時点で、必要に応じてページを更新できます。
しかし、スクリプトが (間違いまたは設計によって) エンドレス ループに入ってしまうと、準備ができていない場合、それを止めるためにできることはあまりありません。そのため、頻繁に再帰的なことを行うときは、通常、特定のコード ブロックを実行できる回数に制限を設けます。これを行う方法はたくさんあります。動作が実際のエラーであると考える場合は、スローすることを検討してください。例えば
var intMaxIterations = 10000;
var go = function() {
while(true) {
/*DO SOMETHING*/
intMaxIterations--;
if (intMaxIterations < 0) {
throw "Too many iterations. Halting";
}
}
};
編集: このスクリプトを使用しているのはあなただけなので、Web ワーカーが理想的なソリューションであることがわかりました。
あなたが見ている基本的な問題は、JS が無限ループに入ると、ブラウザーをブロックし、実行を停止するために通常使用するイベントに応答しなくなることです。Web ワーカーは同じように高速ですが、ブラウザに負荷がかからず、イベントが正常に発生します。これは、要求の高いタスク (この場合はオイラー問題アルゴリズム) を Web ワーカー JS ファイルに渡すという考え方です。Web ワーカー JS ファイルは独自のスレッドで実行され、メイン ブラウザーで必要とされない場合にのみ CPU リソースを消費します。最終的な結果として、CPU は現在と同じように急上昇しますが、ブラウザーは高速で応答性を維持します。
初めて Web Worker を設定するのは少し面倒ですが、この場合は 1 回だけで済みます。アルゴリズムが戻らない場合は、ボタンを押してワーカー スレッドを強制終了してください。詳細については、MDC でのWeb ワーカーの使用を参照してください。