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

Is PURE Javascript synchronous or asynchronous?

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

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

我不明白的是,当我google"is javascript synchronous or asynchronous"时,答案是javascript是异步的。

但这是真的吗? Javascript 是异步的,因为 Web API 或 c++ API 在浏览器或 Node.js 后端,这使得线程在幕后,但 javascript 那么它本身不是异步的吗?

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

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

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

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

What I don't understand is, when I google "is javascript synchronous or asynchronous", the answer is javascript is asynchronous.

当前流行的 Javascript 实现在需要异步 I/O 才能提高工作效率的环境中。纯语言本身不一定需要它,尽管我不知道有任何假设线程和阻塞的实现 I/O.

Javascript is asynchronous because of the web API's or c++ API in the browser are Node.js backend that makes threads under the hood, but javascript itself isn't asynchronous then?

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

If javascript only has one thread it must be a synchronous language?

你这个问题的意思不是很清楚。默认情况下(不调用 webWorkers 或工作线程)Javascript 运行 将您的 Javascript 代码放在一个线程中,但它可以访问允许操作的非阻塞 I/O 函数运行 与 Javascript 并行。在浏览器中,您可以对您的服务器进行 Ajax 调用,然后在 Ajax 调用完成时去做其他事情(进行一些计算、更新屏幕、更新屏幕上的时钟等。 ..) 然后当来自 Ajax 调用的完成通知到达时,您可以处理结果。虽然 Javascript 的实际行是 运行 一个接一个地同步,但您可以开始异步操作,因此 运行 一些事情与 Javascript 执行并行。我将避免争论是否要将其称为 "synchronous language"。那只是一个语义论证。它按照它的工作方式工作,运行在单个线程中连接你的 Javascript,但利用本机 OS 功能与 [=42] 并行地 运行 其他事情=](如网络操作)。