setTimeout是延迟一段时间执行某个函数
requestAnimationFrame是唯一和硬件屏幕刷新事件挂钩的方法
而且都是事件循环的重要组成部分
 
console.log(0);
setTimeout(() => {
  console.log(111)
}, 0);
requestAnimationFrame((v) => {
  let s = v;
  console.log(222);
  setTimeout(() => {
    console.log(333);
    requestAnimationFrame((v) => {
      console.log(444);
    });
  }, 0);
  setTimeout(() => {
    let i = 500000000;
    while (i--) {
      if (i === 1) console.log(555);
    }
  }, 0);
  setTimeout(() => {
    console.log(666);
  }, 0);
  requestAnimationFrame((v) => {
    console.log(777);
  });
});
1. 比较下AnimationFrame与setTimeout - 宏任务和requestAni的关系;
执行顺序一般是:0-222-111-777-333-555-444-666
基本可以琢磨出:
1.setTimeout只是将一个回调函数放入到一个回调队列;
2.setTimeout完成之后会检查是不是该进行frame更新,如果需要则调用requestAnimationFrame的回调,而它是在屏幕刷新之前执行的;
3.setTimeout在空闲时会持续执行;
4.requestAnimationFrame也许存在层级关系,所以777会先于333,但444不会先于555