setTimeout和setInterval的区别

151 阅读1分钟

前言: setTimeout和setInterval在第一次遇到的时候,都会直接添加进入任务队列,然后等待延迟执行,此后每隔timeout,setInterval会往任务队列里添加一次任务。

第一次执行会直接添加任务队列的证明:

  setInterval(() => {
    console.log(1);
  }, 1000);
  setTimeout(() => {
    console.log(2);
  }, 1000);

在上述代码中,1s后1,2会同时打出,所以是执行到它的时候,直接添加进了任务队列才会执行到setTimout添加任务队列,一起等待了1s

区别

区别在于每次遇到setTimout,都会将任务添加进入任务队列,而setInterval添加完第一次后,就会每隔timeout向任务队列添加一次,如果在这个过程中,有上一次添加的setInterval没有执行,就不会添加,会导致有任务被遗漏的问题,证明代码如下:

console.log(Date.now());
let date = new Date().getTime();
while (Date.now() - date < 3000) {}
console.log('等待结束:', Date.now());
setInterval(() => {
console.log('setInterval,', Date.now());
}, 1000);
setTimeout(() => {
 console.log('setTimeout,', Date.now());
 let date = new Date().getTime();
 while (Date.now() - date < 3000) {}
 console.log('setTimeout,', Date.now());
}, 1000);

上述代码中,会发现,打印出“等待结束”后,等待1s同时打印setInterval,setTimeout,然后等待3s后,setTimeout里面的任务执行完成,才会再去打印setInterval里面的时间,中间第2s的时间未能打印出来,被遗漏了。