我对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让我感到奇怪的是,在单线程环境中是否应该不应该这样2做4?如果没有,那么JS怎么知道第二个setTimeout应该在第一个之前完成?难道不应该有两个线程可以同时工作以完成两个setTimeouts以便进行通知EventLoop吗?
1 3 4 2
4
2
setTimeout
EventLoop
JavaScript(在浏览器中) 不能 同时运行2。
最多 一个 的的setTimeout回调可以同时执行-因为有 一个 JavaScript执行上下文或“线程”。
但是,要运行的“下一个计划的超时”始终在下一个运行。“ 4”在“ 2”回调之前运行,因为它 计划更快地运行 。超时是 从 同一时间有效安排的(没有操作被阻止),但是“ 2”的间隔要长得多。
基础实现 可能 使用线程1-但是,在同一全局上下文 中的 JavaScript 不会 并发运行,并保证所有回调之间的行为 一致 且 原子 。
1也许不是;可以在select/poll实现中没有任何线程的情况下进行处理。
select/poll
2在相同的上下文中:例如,Tab / Window,WebWorker,宿主浏览器控件。例如,在同时运行WebWorkers的同时,它们在 不同的 上下文中运行并遵循相同的异步模型(例如,计时器使用的模型)。