setTimeout 对比 WebWorker 对比 XMLHttpRequest

setTimeout vs WebWorker vs XMLHttpRequest

我需要更清楚地理解这些概念,因为我不确定它们。 Javascript 是单线程的,到目前为止,还不错。

  1. 根据我的理解,setTimeout只是延迟了主线程代码的执行,但是当调用堆栈为空时,回调仍然在主线程上执行。这个对吗? Promises 和事件处理程序也是如此。

    setTimeout(() => {
    console.log('this line of code is executed on the main thread');
    }, 5000);
    
  2. 对于使用 XMLHttpRequest 的异步请求,实际请求被发送到一个单独的 API ,由在单独线程上运行它的浏览器实现,因此,它是真正异步的。这是正确的吗?

  3. WebWorkers 将是浏览器实现的另一个 API,它也在后台线程中运行来自给定脚本的代码。这是正确的吗?

如果能回答这个问题,我将不胜感激!

您在所有三点上大体上都是正确的。

  1. 设置超时和任何其他异步函数在先决条件完成时排队等待执行。因此,当调用堆栈为空并且有工作要做时,JS 会选择下一个排队的函数并执行它。这由所谓的 javascript 事件队列处理。
  2. 与 setTimeout 没有太大的实际区别。一旦完成,这两个函数都会对您的回调进行排队,负责实现的代码已定义,因此浏览器可以选择就多线程而言如何执行。
  3. 是的,worker 运行在另一个线程中并且有自己的事件循环。如果它向主线程发送消息,则该消息的回调与该消息一起排队到主线程中的 运行,反之亦然。请注意,据我所知,Web 浏览器没有义务为每个工作人员提供一个线程,但这不会以任何方式影响您。