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