首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >setTimeout()是否在单独的线程上运行?

setTimeout()是否在单独的线程上运行?
EN

Stack Overflow用户
提问于 2018-08-22 06:22:49
回答 5查看 6.2K关注 0票数 8

出于对是否会异步启动setTimeout()的好奇,我尝试了以下测试脚本:

代码语言:javascript
运行
复制
function timedText() {
  var x = document.getElementById("txt");
  setTimeout(function() {
    x.value = "1 second"
  }, 1000);
  setTimeout(function() {
    x.value = "2 seconds"
  }, 2000);
  setTimeout(function() {
    x.value = "3 seconds"
  }, 3000);

  while (true) {}
}
代码语言:javascript
运行
复制
<p>Click on the button below. The input field will tell you when two, four, and six seconds have passed.</p>

<button onclick="timedText()">Display timed text</button>
<input type="text" id="txt">

当然,单击该按钮会导致浏览器挂起。

这告诉我,setTimeout()在单独的线程上运行而不是

但在最近的一次采访中,面试官提出了相反的建议.这是否意味着setTimeout()依赖于浏览器/实现?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-08-22 06:31:18

JavaScript不是多线程的。有一些WebWorkers运行在不同的线程中,但这并不是真正的多线程,更像是多个进程,可以相互通信。

因此,while (true) {}将阻塞js上下文,因为它是一个没完没了的循环。

setTimeout将注册一个函数以供以后执行。但在任何时候,代码都不会在相同的上下文中并行运行。

while (true)本身不一定会创建阻塞循环:

代码语言:javascript
运行
复制
async function sleep(time) {
  return new Promise((resolve, _) => setTimeout(resolve, time))
}

async function test(val) {
  while (true) {
    console.log('in while loop ' + val)
    await sleep(1000)
  }
}

test('foo')
test('bar')

因此,您可以说,使用await/async,您可以创建某种协作的多任务处理,比如安装,但仍然没有多线程。

票数 14
EN

Stack Overflow用户

发布于 2018-08-22 06:32:00

javascript中没有线程。setTimeout只将委托函数推送到下一次将弹出的堆栈中。你可以读到那个JavaScript和线程

票数 5
EN

Stack Overflow用户

发布于 2018-08-22 06:40:16

这告诉我,setTimeout()并不在单独的线程上运行。

是。JS中只有一个线程。

但在最近的一次采访中,面试官提出了相反的建议.这是否意味着setTimeout()依赖于浏览器/实现?

据我所知,只有引擎从一个浏览器变成另一个浏览器。内部机制是相同的事件循环处理器.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51960879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档