日常学习1——事件循环与异步
事件循环、单线程、异步与计时器相关,面试八股整理笔记。
一、如何理解 JS 的异步
问题
- 如何理解 JS 的异步?
参考答案
单线程与主线程
JS 运行在浏览器的渲染主线程上,该线程只有一个;要负责页面渲染、执行 JS 等。若全部用同步方式,主线程易阻塞,消息队列里很多任务跑不动:既浪费主线程时间,又导致页面难以及时更新,像「卡死」一样。为什么用异步
对计时器、网络、事件监听等,主线程把活交给其他线程/机制,自己立刻继续往下执行。其他线程完成后再把回调包装成任务,放进消息队列末尾排队,等主线程来调度。这样主线程不被长时间占住,单线程下仍能尽量保持流畅。
二、事件循环
问题
- 阐述一下 JS 的「事件循环」。
参考答案
别称
事件循环 = 消息循环,描述的是渲染主线程的工作方式。在浏览器里的工作方式
在 Chrome 源码中可理解为:有一个不结束的 for 循环,每轮从消息队列里取一个任务执行,其他线程在合适时把新任务推到队列末尾。关于宏/微任务
过去常简单分成「宏队列、微队列」,在复杂实现里已不够;W3C 的表述是:不同类型任务对应不同队列,同类型必须在同一队列、不同类型可在不同队列;各队列有不同优先级,一次事件循环中由浏览器决定从哪个队列取任务,但须保证存在微任务队列且微任务具有最高优先级,要先调度、先执行。
三、JS 中的计时器能做到精确计时吗
问题
- JS 中的计时器能不能精确计时?为什么?
参考答案
- 不能,大致原因如下:
- 计算机没有原子钟一类硬件,本身做不到绝对精确。
- 操作系统的计时函数就有偏差;JS 计时器最终调用 OS,会带上这些偏差。
- 按 W3C 标准,浏览器在实现计时器时,若嵌套层级超过 5 层,会带有 4ms 最低间隔 等规则,在期望间隔很短时也会带来额外偏差。
- 受事件循环约束:回调只能在主线程空闲时执行,实际触发时刻还会被排队影响。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Fuya0's Blog!




