我想知道以下javascript环境如何作为系统互连。
我们可以将此限制为浏览器环境,因为另一篇文章(here)已涵盖节点
Javascript是单线程的,因此只有一个callstack。
Javascript环境只提供一些真正异步的函数。这些可能包括setTimeout(),setInterval()和I / O函数。
console.log(‘Sync code started…’);
setTimeout(function asyncLog() {
console.log(‘Async function has completed’)
}, 2000);
console.log(‘Sync code finished…')
(如果我错了,请纠正步骤)
如果有人可以概述async函数(例如setTimeout)从第一次调用callstack到调用它们的时间和位置的步骤的概述,则不需要逐个回答这些步骤。 callstack。
答案 0 :(得分:11)
您的理解和示例似乎基本上是正确的。现在,问你的问题:
在第3步,谁产生这个新线程?是浏览器吗?
是。它基本上是为那些“真正异步”功能提供实现的东西。 IIRC,setTimeout
直接在JS引擎中实现,而网络IO肯定是浏览器的责任 - 但创建它们并不重要。最后,在您的“浏览器环境”中,它始终是浏览器的一部分。
这个新主题被阻止了吗?
是。不。这取决于需要完成的工作,即您调用的异步功能。有些人可能需要旋转一个新线程,但是对于简单的超时,我很确定使用了非阻塞系统调用。
如果你有一个创建1000个setTimeouts的循环会发生什么。是否创建了1000个“线程”?
可能的。但不太可能。我假设那些真正需要自己的线程的异步操作,使用线程池,并且请求排队。此池的大小可能隐藏在浏览器配置的大小中。
一次可以生成多少个线程是否有限制?
这将由操作系统控制。
当新线程完成执行时,它如何以队列结束?谁提供了事件队列?
基本上,每个这样的线程的最后一个操作是将其结果放在事件队列中。
谁提供事件循环?事件循环是否轮询事件队列?
我会说这是一个实现细节,无论循环轮询队列还是队列驱动循环迭代。
javascript的线程是否知道事件循环?或者Event循环只是把东西推到堆栈上?
我会说javascript在事件循环线程中运行。事件循环只是反复弹出队列中的事件并执行他们的javascript。
事件循环如何知道堆栈何时清除?
事件循环调用 javascript执行 - 因此当javascript返回时,堆栈是清晰的。