SetTimeout, setInterval


ブラウザ環境では、実際の待ち時間は0ではありません.
ブラウザは、HTML 5標準に規定されたオーバーラップタイマ実行間隔の制限を遵守する.この基準では、「5番目のオーバーラップタイマの後、待機時間は少なくとも4ミリ秒以上に制限する必要があります.」このような制限が明示されている.
これらの制限については、例を参照してください.例のsetTimeoutは、関数runを遅延なく再呼び出すようにスケジューリングされる.アレイtimesには、実際の遅延間隔に関する情報が記録されており、アレイ時間にどのような値が格納されているかを見てみましょう.
let start = Date.now();
let times = [];

setTimeout(function run() {
  times.push(Date.now() - start); // 이전 호출이 끝난 시점과 현재 호출이 시작된 시점의 시차를 기록

  if (start + 100 < Date.now()) alert(times); // 지연 간격이 100ms를 넘어가면, array를 얼럿창에 띄워줌
  else setTimeout(run); // 지연 간격이 100ms를 넘어가지 않으면 재스케줄링함
});

// 출력창 예시:
// 1,1,1,1,9,15,20,24,30,35,40,45,50,55,59,64,70,75,80,85,90,95,100
前のタイマーはspecに書いてあるように、直接運転を遅らせることはありません.しかし、5番目のオーバーラップタイマの後、遅延間隔は4ミリ秒を超え、9, 15, 20, 24...と同じ値が格納されていることがわかる.
この制限は、setTimeoutだけでなく、setIntervalにも適用される.setInterval(f)度の前回の関数fは、遅延なしで動作したが、その後、遅延間隔を4ミリ秒以上に増やした.
これは以前から存在していた制約ですが、古いスクリプトの中にはこの制約に依存しているものもあるため、リストを変更することはできません.
一方,サーバ側にはこのような制限はない.Node.jsのprocess.nextTickおよびsetImmediateを用いて、非同期動作を遅延なく実行することができる.上記の制限はブラウザのみです.
ご存知のように、DOM変更を画面に表示するには、時間の長さにかかわらず、ブラウザが現在の作業タスクを完了する必要があります.