【发布时间】:2015-04-23 10:05:08
【问题描述】:
我一直在阅读这篇文章 http://ejohn.org/blog/how-javascript-timers-work/ 以及 setTimeout 和 setInterval 以及其他异步任务(例如按钮单击)如何让我有些困惑。
我知道 JS 是单线程的,也就是说,AFAIK,所有的回调函数(也就是事件处理程序)都会被排队并按顺序执行。但是,请看下面我从文章中截取的图片,上面有链接:
每个块代表一些工作,并且 - 在大约 10 毫秒时 - 计时器被触发。我知道它的回调函数被放在队列中以供以后执行,但是为什么在已经执行某些东西的时候会调用事件呢?
是因为setTimeout() 开始使用单独的线程在内部计算时间并触发其完成事件吗?
请注意,我在这里不是在谈论它的回调执行;相反,我试图了解setTimeout 如何计算时间并触发其完成。我知道它的回调不会在其给定的时间参数之前被调用,但可能会更晚,但这是因为它的回调被排队到稍后的时间,当运行时找到一些时间来检查队列中是否有任何要执行的东西。
与这个问题类似,浏览器如何接受新的点击注册而 - 比方说 - 在用户点击的那一刻,一个循环在幕后工作?
如果你说浏览器为不同的事情维护不同的线程,那么我们可以在浏览器中调用JS单线程吗?
【问题讨论】:
-
另外,请查看此问题的答案:stackoverflow.com/questions/1663125/is-javascript-multithreaded 您的问题为对话增添了一个有趣的元素。我不知道它是否是重复的,因为问题本身有很大不同