作者回复:
非常高兴你能提出这些问题。
你有这两个疑问很正常,说明你看得很仔细,之所以你会感到疑惑,主要是我在写作过程中偷懒了。
我先来解答你的第一个问题:
第一段话是WHATWG标准定义的,在WHATWG规范,定义了在主线程的循环系统中,可以有多个消息队列,比如鼠标事件的队列,IO完成消息队列,渲染任务队列,并且可以给这些消息队列排优先级。
但是在浏览器实现的过程中,目前只有一个消息队列,和一个延迟执行队列。
一个是规范,一个是实现,主要我没有在文中强调这点,所以你会产生的这样的疑问。
关于第二个问题解释起来就比较复杂了,涉及到来了V8是怎么执行的了,专栏中的"全局执行上下文"我没有深入分析。所以我偷懒了,把两个稍微有点不同的概念都称为了“全局执行上下文”,要解释清楚这个问题还要牵涉到V8的一个底层逻辑,既然你提出来了,那我就打算在课程结束后,通过加餐的形式来开一讲,讲清楚了这个还能额外地理解 Realm 概念。
作者回复: 要理解这个就得讲观察者模式了,不过展开又是一篇文章,我到时候加餐的时候再来结合观察者模式来讲这个。
作者回复: 嗯。后面有疑问正常,理论偏多,而且篇幅之间的依赖性比较强。可以把你的问题列出来,答疑的时候我会结合实际列子来分析。
作者回复: setTimeout因为是定时任务,设定的时间间隔没有到是不会执行,由此需要一个单独的模块来保存定时器的消息,你可以通过该模块取出到期的任务,我们把这个模块叫延时队列,Chrome内部用了个hashmap保存数据,然后又写了取出到期的任务的策略!
通常情况下,是当渲染主线程在执行完一个正常的任务之后,再判断该模块中是否有到期的任务,如果有取出来执行!
作者回复: js只不是任务的一个过程,这里讲的都是C++层面的,所以也可以说是系统调用栈。
具体的你可以看看加餐5
作者回复: 后续有补充内容