开发者应该知道的 JavaScript 深层概念
下一步是学习 JavaScript 中不好理解的部分,如事件循环、web API 和异步等内容。


异步

在谈论事件循环和 web worker 之前,我们应该弄清楚异步对 JavaScript 而言是什么,以及当 JavaScript 是一种单线程语言时,如何处理异步。

JavsScript 是一种单线程同步编程语言,本身不支持多线程或异步模式,但借助于浏览器(浏览器 API)和 JavaScript 的某些底层机制,我们可以拥有异步 JavaScript!

上图确切说明了 JavaScript 引擎和我们从浏览器获得的 Web API 发生的事情,我们来解释一下。

JavaScript 有一个名为“调用堆栈(Call Stack)”的简单列表,它逐个管理任务(堆栈算法),但是当传递异步任务时,JavaScript 会将其弹出到 web API,浏览器会处理 它,比如 setTimeout API,当异步任务的结果准备好时,浏览器会通过一些底层机制(下文会讲)将其带回堆栈。


事件循环

还记得上一节我告诉过大家,异步任务在后台完成后会返回调用堆栈吗?处理这一机制的过程称为“事件循环”。

事件循环将持续查看调用堆栈,如果里面没有任务,而且是空闲的,它将按优先级把事件推到调用堆栈。

来自会话栈博客的解释事件循环的动图


回调队列和微任务队列

想象一下在一秒内同时完成两个异步任务,而且两个异步任务都刚从 web API 回来,那么哪一个会被先推送到回调?

JavaScript 对此有一套机制,它将回调任务分成两部分:微观任务宏观任务

宏观任务队列在定时器到期后从 setTimeout() API 获得普通回调函数。

在获取事件循环的回调函数方面,宏观任务的优先级低于微观任务队列。

微观任务队列通过承诺和突变观察者获得回调函数。

原文作者:Sina Farhad
原文链接:https://javascript.plainenglish.io/javascript-deep-concepts-you-should-know-8965d4e409d3


推荐阅读
相关专栏
开发者实践
182 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和声网 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。