JavaScriptでタイマー機能の2つ(主に使用される)のタイプがありますsetTimeout
とsetInterval
(other)
これらの方法はどちらも同じシグネチャを持っています。彼らは、コールバック機能と遅延時間をパラメータとして取ります。
setTimeout
は遅延後に1回だけ実行され、一方setInterval
はすべての遅延秒後にコールバック関数を呼び出し続けます。
これらのメソッドは両方とも、タイマーの有効期限が切れる前にクリアするために使用できる整数の識別子を返します。
clearTimeout
とclearInterval
これらのメソッドの両方が上記の機能setTimeout
とsetInterval
をから返される整数の識別子を取る例:
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
あなたは上記のコードを実行した場合あなたはそれが警告を受けるのを見るでしょうbefore setTimeout
、その後after setTimeout
最終的には、1秒(1000ミリ秒)後I am setTimeout
に警告
あなたは例から気づくことができる何setTimeout(...)
はタイマーが前に経過を取得することは待たないことを意味する非同期であるということです次の声明に行く。電子alert("after setTimeout");
例:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
あなたは上記のコードを実行した場合、あなたはそれがafter setInterval
その後、before setInterval
を警告し、最終的にそれがI am setInterval
に警告していることがわかります setTimeoutは5秒後にタイマーをクリアするため、1秒後に5回(1000ms)、それ以外の場合は1秒ごとにアラートが表示されます。I am setInterval
無限になります。
ブラウザは内部的にどうしていますか?
簡単に説明します。
JavaScriptがイベントキューについて知っておく必要があることを理解する。ブラウザに実装されたイベントキューがあります。イベントがjsでトリガされるたびに、これらのイベント(クリックなど)がすべてこのキューに追加されます。ブラウザに何も実行されていなければ、キューからイベントを受け取り、それを1つずつ実行します。
setTimeout
またはsetInterval
をコールすると、コールバックはブラウザのタイマーに登録され、所定の時間が経過するとイベントキューに追加され、最終的にJavaScriptがイベントをキューから取り出して実行します。
これは、javascriptエンジンがシングルスレッドであり、一度に1つしか実行できないためです。だから、彼らは他のjavascriptを実行することはできず、あなたのタイマーを追跡することはできません。そのため、これらのタイマーはブラウザに登録されており(ブラウザはシングルスレッドではありません)、タイマーの経過を把握し、タイマーの期限が切れた後にキューにイベントを追加することができます。
setInterval
の場合にのみ同じイベントが発生します。この場合、イベントはクリアされるか、ブラウザページがリフレッシュされるまで、指定された間隔で何度もキューに追加されます。あなたはこれらの関数に渡す
注
遅延パラメータは、コールバックを実行するための最小遅延 時間です。これは、タイマーの終了後に ブラウザが javascriptエンジンによって実行されるキューにイベントを追加するためですが、コールバックの実行はキュー内の イベント位置によって異なり、エンジンはシングルスレッドであるため、 が実行されますキュー内のすべてのイベントを1つずつ表示します。
はしたがって、あなたのコールバックは、いつかあなたの他のコード・ブロックスレッドとそれをキューにありますどのような処理する時間を与えていない特別なときに呼び出される指定された遅延時間以上かかることがあります。
そして、私が言及したように、javascriptはシングルスレッドです。したがって、スレッドを長時間ブロックした場合。
あなたのユーザーがに応答しないページを言ってメッセージを取得することがあり
while(true) { //infinite loop
}
このコードのように。
あなたは 'setTimeout'を探していますか? 'setTimeout(function(){alert("これは500 ms ")}、500);' – Downgoat
https://www.w3schools.com/js/js_timing.asp –
以下の答えは見逃しています'ballReset'呼び出しは' setTimeout'で遅れますが、 'moveEverything'の残りのコードは' ballReset'が呼び出されるのを待たずに引き続き実行されることを説明しています。なぜこの遅延が必要なのか、それがコードロジックの残りの部分に当てはまるかを説明する必要があります。 – Igor