setTimeout(0)是将任务立即插入到事件列队的末尾吗?

  1. JavaScript是单线程执行的,无法同时执行多段代码。当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个队列。一旦当前任务执行完毕,再从队列中取出下一个任务,这也常被称为 “阻塞式执行”。所以一次鼠标点击,或是计时器到达时间点,或是Ajax请求完成触发了回调函数,这些事件处理程序或回调函数都不会立即运行,而是立即排队,一旦线程有空闲就执行。假如当前 JavaScript线程正在执行一段很耗时的代码,此时发生了一次鼠标点击,那么事件处理程序就被阻塞,用户也无法立即看到反馈,事件处理程序会被放入任务队列,直到前面的代码结束以后才会开始执行。如果代码中设定了一个 setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为 0,就代表立即插入队列,但不是立即执行,仍然要等待前面代码执行完毕。所以 setTimeout 并不能保证执行的时间,是否及时执行取决于 JavaScript 线程是拥挤还是空闲
  2. 上面的这段话可以这么理解吗?

    1. 如果arr这个数组代表任务列队,目前有三个任务待执行:arr=[1,2,3];
    2. setTimeout(0)将一个任务a立即插入到任务列队中,就是说把任务a插入到arr的末尾吗?也就是当前列队实际是[1,2,3,a]?
    3. 浏览器在合适的时间去执行a,就是说等列队中的1,2,3都执行结束后,再执行a?
  3. 我这样理解是否正确,因为我不明白插入到列队是插入到列队的哪里,浏览器什么时候才能认为是合适的时间?
阅读 2.8k
1 个回答

事件循环机制是为了处理异步操作的行为,所以这里是的任务队列是存储异步操作完成之后的回掉函数的地方。 按异步操作的完成先后插入队列,因此setTime(fn, 0)就会及时插入队列,但不会立即执行。 你可以尝试,同时设置不同的时间来测试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题