一尘不染

Javascript是如何单线程的?

javascript

我对Javascript的单线程性质有疑问。

console.log("1");
setTimeout(function(){console.log("2");},3000);
console.log("3");
setTimeout(function(){console.log("4");},1000);

此代码的结果是1 3 4 2。如您所见,这4之后2让我感到奇怪的是,在单线程环境中是否应该不应该这样24?如果没有,那么JS怎么知道第二个setTimeout应该在第一个之前完成?难道不应该有两个线程可以同时工作以完成两个setTimeouts以便进行通知EventLoop吗?


阅读 300

收藏
2020-05-01

共1个答案

一尘不染

JavaScript(在浏览器中) 不能 同时运行2。

最多 一个 的的setTimeout回调可以同时执行-因为有 一个 JavaScript执行上下文或“线程”。

但是,要运行的“下一个计划的超时”始终在下一个运行。“ 4”在“ 2”回调之前运行,因为它 计划更快地运行 。超时是
同一时间有效安排的(没有操作被阻止),但是“ 2”的间隔要长得多。

基础实现 可能 使用线程1-但是,在同一全局上下文 中的 JavaScript 不会 并发运行,并保证所有回调之间的行为 一致原子


1也许不是;可以在select/poll实现中没有任何线程的情况下进行处理。

2在相同的上下文中:例如,Tab / Window,WebWorker,宿主浏览器控件。例如,在同时运行WebWorkers的同时,它们在 不同的
上下文中运行并遵循相同的异步模型(例如,计时器使用的模型)。

2020-05-01