javascript setTimeout
とsetInterval
(other)には2種類の(主に使用される)タイマー関数があります。
これらのメソッドは両方とも同じ署名を持っています。これらは、コールバック関数と遅延時間をパラメーターとして受け取ります。
setTimeout
遅延後に一度だけ実行さ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
最後I am setTimeout
に1秒(1000ミリ秒)後に警告が表示されます。
この例からわかるの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);
上記のコードを実行すると、アラートが表示さbefore setInterval
れ、after setInterval
最終的I am setInterval
に1秒(1000ミリ秒)後に5回アラートが表示されます。これは、setTimeoutが5秒後にタイマーをクリアするか、1秒ごとにアラートが発生するためです。I am setInterval
。
どのようにブラウザは内部的にそれをしますか?
簡単に説明します。
JavaScriptでイベントキューについて知る必要があることを理解するには。ブラウザに実装されたイベントキューがあります。イベントがjsでトリガーされると、これらのイベント(クリックなど)がすべてこのキューに追加されます。ブラウザーで実行するものがない場合は、キューからイベントを受け取り、それらを1つずつ実行します。
今、あなたが呼び出すとき setTimeout
やsetInterval
コールバックがブラウザのタイマーに登録され、指定された時間が経過するとイベントキューに追加され、最終的にJavaScriptがキューからイベントを取得して実行します。
これは、JavaScriptエンジンがシングルスレッドであり、一度に1つしか実行できないためです。そのため、他のJavaScriptを実行したり、タイマーを追跡したりすることはできません。そのため、これらのタイマーはブラウザーに登録され(ブラウザーはシングルスレッドではありません)、タイマーを追跡し、タイマーの期限が切れた後にキューにイベントを追加できます。
setInterval
この場合にのみ同じことが起こります。イベントがキューに追加されるのは、指定された間隔の後、イベントがクリアされるかブラウザのページが更新されるまでです。
注意
これらの関数に渡す遅延パラメーターは、コールバックを実行するための最小遅延時間です。これは、タイマーの期限が切れると、ブラウザがJavaScriptエンジンによって実行されるイベントをキューに追加しますが、コールバックの実行は、キュー内のイベントの位置に依存し、エンジンがシングルスレッドであるため、すべてのイベントを実行するためですキューを1つずつ。
したがって、他のコードがスレッドをブロックし、キューにあるものを処理する時間を与えない場合、コールバックは指定された遅延時間よりも特別に呼び出されるのに時間がかかることがあります。
そして私が言及したように、javascriptはシングルスレッドです。したがって、スレッドを長時間ブロックした場合。
このコードのように
while(true) { //infinite loop
}
ユーザーには、ページが応答しないというメッセージが表示される場合があります。
setTimeout(function(){/*YourCode*/},1000);