请看这四个setTimeout函数及其执行部分
P粉304704653
P粉304704653 2023-09-17 18:04:25
0
1
588

//1
setTimeout(() => {
  console.log('hi');
}, 5000)

//2
setTimeout(() => {
  console.log('hello');
}, 3000)

//3
setTimeout(() => {
  console.log('bye');
}, 0)

//4
setTimeout(() => {
  console.time('the code took:');
  let i = 10000
  while (i--) {
    console.log(i);
  }
  console.timeEnd('the code took:')
}, 7000)

这里我写了四个setTimeout函数,根据我的了解,它们会在回调队列中同时开始执行,对吗?如果我是对的,那么我的疑问是,第四个setTimeout()函数在回调队列中是否已经完成了一半或者超过一半的执行,还是在推入调用栈后的7秒钟后,它从头开始执行?所以后台发生了什么?

P粉304704653
P粉304704653

全部回复(1)
P粉709307865

这些函数在回调队列中不会并行或同时运行。它们是单独和异步地调度的。执行顺序取决于每个函数的指定延迟。对于每个setTimeout函数,都会安排一个回调在指定的延迟之后执行。

执行顺序如下:

第三个setTimeout(0毫秒延迟)
第二个setTimeout(3000毫秒延迟)
第一个setTimeout(5000毫秒延迟)
第四个setTimeout(7000毫秒延迟)

然而,第四个setTimeout函数不一定与其他setTimeout函数一起运行,也不能保证其自身的执行时间。执行顺序由回调队列确定,事件循环从回调队列中获取任务,并且仅当调用栈为空时才在调用栈中运行它们。因此,只有在调用栈中没有其他任务时,第四个setTimeout函数才会开始执行。运行给定代码后,输出应按照以下顺序显示:

以下是输出的序列:

1. bye
2. hello
3. hi
4. 从10000打印到0(降序)
5. 代码执行时间为...毫秒
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板