Lawguancong / Daily-Charging-Learning

0 stars 0 forks source link

setTimeout倒计时为什么会出现误差? #16

Open Lawguancong opened 3 years ago

Lawguancong commented 3 years ago

从任务队列 宏任务 微任务 执行栈的角度解释 执行栈(同步) -> 任务队列 (异步:宏任务、微任务) setTimeout() 只是将事件插入了“任务队列”,必须等当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码消耗时间很长,也有可能要等很久,所以并没办法保证回调函数一定会在 setTimeout() 指定的时间执行。所以, setTimeout() 的第二个参数表示的是最少时间,并非是确切时间。 HTML5标准规定了 setTimeout() 的第二个参数的最小值不得小于4毫秒,如果低于这个值,则默认是4毫秒。在此之前。老版本的浏览器都将最短时间设为10毫秒。另外,对于那些DOM的变动(尤其是涉及页面重新渲染的部分),通常是间隔16毫秒执行。这时使用 requestAnimationFrame() 的效果要好于 setTimeout();