PURE Javascript 是同步的还是异步的?

Posted

技术标签:

【中文标题】PURE Javascript 是同步的还是异步的?【英文标题】:Is PURE Javascript synchronous or asynchronous? 【发布时间】:2020-10-03 12:18:50 【问题描述】:

据我了解,javascript 要么在浏览器中运行,要么在 Node.js 中作为后端运行。

浏览器或 Node.js,取决于您运行 javascript 的位置,将通过 Web API 或 c++ API 处理阻止运行时的函数(即网络调用、图像渲染等),然后将它们发送到事件循环并最终将它们合并到运行 javascript 的单个线程中。

我不明白的是,当我谷歌“是 javascript 同步还是异步”时,答案是 javascript 是异步的。

但这是真的吗? Javascript 是异步的,因为浏览器或 Node.js 后端中有 Web API 或 c++ API,这使得线程处于底层,但 javascript 本身不是异步的吗?

如果javascript只有一个线程,它必须是一种同步语言?

【问题讨论】:

【参考方案1】:

Javascript(在浏览器和 node.js 中实现)是一个事件驱动系统。

这意味着它在与非阻塞、异步 I/O 一起使用时效果最佳,可以为您提供与事件驱动系统协调的最佳体验和功能。这不一定是 Javascript 语言本身所固有的(您可以制作一个只有阻塞 I/O 的 Javascript 版本),但是所有流行的 Javascript 实现都依赖于事件队列并依赖于异步 I/O 工作与事件队列协调以提供有用的编程环境。

直到最近,Javascript 还没有有用的线程和有用的线程同步工具来使具有阻塞 I/O 的多线程系统变得实用或有用。现在浏览器和 node.js 中都有线程,尽管 node.js 中的线程非常笨拙(V8 解释器的全新实例,单独的堆等......)所以它们不一定是性能与具有更多内置功能的系统相比具有竞争力。此外,Javascript 中的线程同步工具还处于开发的早期阶段。

我不明白的是,当我google“是javascript同步还是异步”时,答案是javascript是异步的。

当前流行的 Javascript 实现是在需要异步 I/O 以提高生产力的环境中。纯语言本身不一定需要它,尽管我不知道有任何假设线程和阻塞 I/O 的实现。

Javascript 是异步的,因为浏览器中的 web API 或 c++ API 是 Node.js 后端,可以在后台创建线程,但 javascript 本身不是异步的吗?

Javascript 环境具有异步功能,因为 Javascript 与事件驱动环境配对,并与定时器和 I/O 等异步操作配对。因此,Javascript 实现和环境添加到其中的其他东西的组合使环境能够编写可以使用异步功能的代码。请不要太在意关于 Javascript 本身是否异步的语义争论。据我所知,指定 Javascript 语言的 ECMAScript 规范不一定要求这样做。我认为可能存在没有异步功能的纯 Javascript 语言的实现。但是,您在网络上或书籍中阅读的大部分内容都指的是“Javascript”,而它们真正的意思是流行的 Javascript 实现,例如在 Web 浏览器或 node.js 中。而且,坦率地说,这主要是相关的,因为这是您可以实际使用 Javascript 的地方,除非您要构建自己的自定义环境。

如果javascript只有一个线程,那它一定是一种同步语言?

这个问题的意思并不完全清楚。默认情况下(不调用 webWorkers 或 Worker Threads)Javascript 在一个线程中运行您的 Javascript 代码,但它可以访问非阻塞 I/O 函数,这些函数允许操作与您的 Javascript 并行运行。在浏览器中,您可以对服务器进行 Ajax 调用,然后在 Ajax 调用完成时执行其他操作(进行一些计算、更新屏幕、更新屏幕上的时钟等...),然后在完成时通知从 Ajax 调用到达,您可以处理结果。虽然您的实际 Javascript 行一个接一个地同步运行,但您可以启动异步操作,从而在 Javascript 执行的同时运行一些事情。我将避免争论是否要将其称为“同步语言”。这只是一个语义论点。它以它的工作方式运行,在单个线程中运行您的 Javascript,但利用本机操作系统功能与 Javascript 并行运行其他事情(如网络操作)。

【讨论】:

以上是关于PURE Javascript 是同步的还是异步的?的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的同步和异步循环

javascript中事件处理程序的异步或同步调用

JavaScript, 函数是实现异步的基础

Django是同步的还是异步的?

js异步处理

javascript中异步,同步解析