front-end-pigs / blog

博客
2 stars 0 forks source link

setTimeout 为什么会出现误差? #21

Open jangdelong opened 4 years ago

jangdelong commented 4 years ago

定时器是属于 宏任务(macrotask) 。如果当前 执行栈 所花费的时间大于 定时器 时间,那么定时器的回调在 宏任务(macrotask) 里,来不及去调用,所有这个时间会有误差。

我们看以下代码:

setTimeout(function () {    console.log('biubiu');}, 1000);某个执行时间很长的函数();

如果定时器下面的函数执行要 5秒钟,那么定时器里的log 则需要 5秒之后再大圆,函数占用了当前 执行栈,要等执行栈执行完毕后再去读取 微任务(microtask),等 微任务(microtask) 完成,这个时候才会去读取 宏任务(macrotask) 里面的 setTimeout 回调函数执行。setInterval 同理,例如每3秒放入宏任务,也要等到执行栈的完成。

还有一种情况如下:

setTimeout(function() {    console.log('嘤嘤嘤');}, 0);

因为 定时器 最小 delay 是 4毫秒,所以小于这个数字,即使 执行栈 已空,依然不会按设置好的 delay 去执行。