「JavaScriptタイミングメカニズムを深く理解する」を読みます.
1178 ワード
鳥の兄のこの《JavaScriptタイミングメカニズムを深く理解します》はjavascriptスレッドの角度からsetTimeoutとset Intervalの二つのタイミングトリガーの実現原理を分析しました.
見終わった体験は主に2点を覚えます.
javascriptのエンジンはシングルスレッドです.
javascriptのエンジンはイベントに基づいて駆動されます.
set Timeoutとset Intervalはいずれもイベントキューに処理対象のイベントを追加するだけです.set Timeoutは一回トリガしますが、set Intervalはサイクルトリガです.
しかし
setTimeoutサイクルトリガを使いたいです.
このようにしてもいいです
しかし、明確に:
スレッドが一つのイベントでブロックされている場合、setIntervalを使ってもsetTimeoutを使っても、現在のイベントの処理が完了するまで待つ必要があります.
たとえば、次の例:
見終わった体験は主に2点を覚えます.
javascriptのエンジンはシングルスレッドです.
javascriptのエンジンはイベントに基づいて駆動されます.
set Timeoutとset Intervalはいずれもイベントキューに処理対象のイベントを追加するだけです.set Timeoutは一回トリガしますが、set Intervalはサイクルトリガです.
しかし
setTimeoutサイクルトリガを使いたいです.
このようにしてもいいです
setTimeout(function() {
/* ... */
setTimeout(arguments.callee, 10);
}, 10);
これは和やかに見えるsetInterval(function(){
/* ... */
}, 10);
しかし、前のコードの中でコードブロックを実行してから、このイベントを保留します.だから、2回の実行時間は10より大きいです.2番目のコードは自動的に10の時にこのイベントをかけるので、2回のイベントの間の時間は10以下になります.しかし、明確に:
スレッドが一つのイベントでブロックされている場合、setIntervalを使ってもsetTimeoutを使っても、現在のイベントの処理が完了するまで待つ必要があります.
たとえば、次の例:
function sleep(d){
document.write(Date.now() + "<br>");
for(var t = Date.now();Date.now() - t <= d;) {
}
}
setInterval(function() {
sleep(9123)
}, 1000);
これは1 sに一回印刷するのではなく、約9 sに一回印刷するのです.これはスレッドがforサイクルにブロックされているからです.