事件循环和并发

JavaScript 有一个基于 事件循环并发模型,事件循环负责执行代码、收集和处理事件以及执行队列中的子任务

栈: 函数调用形成了一个由若干帧组成的栈
堆: 对象被分配在堆中
队列: 一个 JavaScript 运行时包含了一个待处理消息的消息队列。每一个消息都关联着一个用以处理这个消息的回调函数。 运行函数的处理会一直进行到执行栈再次为空为止;

事件循环: 当前消息队列执行结束,才进行下一个消息队列(如果有得话)

这个模型的一个缺点在于当一个消息需要太长时间才能处理完毕时,阻塞别的消息队列。用户等待过长,不能进行别的操作。

在浏览器里,每当一个事件发生并且有一个事件监听器绑定在该事件上时,一个消息就会被添加进消息队列。如果没有事件监听器,这个事件将会丢失。

零延迟: 零延迟并不意味着回调会立即执行。以 0 为第二参数调用 setTimeout 并不表示在 0 毫秒后就立即调用回调函数。
setTimeout 需要等待当前队列中所有的消息都处理完毕之后才能执行,即使已经超出了由第二参数所指定的时间。