javascript - PURE Javascript 是同步还是异步?

标签 javascript node.js asynchronous synchronization

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

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

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

但是这是真的吗? Javascript 是异步的,因为浏览器或 Node.js 后端中的 Web API 或 C++ API 在幕后创建了线程,但 javascript 本身并不是异步的?

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

最佳答案

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

这意味着它与非阻塞异步 I/O 一起使用时效果最佳,可以为您提供与事件驱动系统协调的最佳体验和功能。这不一定是 Javascript 语言本身所固有的(您可以制作一个除了阻塞 I/O 之外什么都没有的 Javascript 版本),但是 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 的流行实现,例如在 Web 浏览器或 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 执行并行运行一些操作。我将避免争论人们是否想将其称为“同步语言”。这只是一个语义论证。它的工作方式如下:在单个线程中运行 Javascript,但利用 native 操作系统功能与 Javascript 并行运行其他内容(例如网络操作)。

关于javascript - PURE Javascript 是同步还是异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62365318/

相关文章:

javascript - jQuery 在显示后隐藏表单字段

javascript - 在低于 500 像素的高度更改窗口高度时,不会触发窗口调整大小事件和媒体查询

node.js - 确定代码是否在 sails.js 中执行

javascript - 您可以使用 browserify 来请求 node-bcrypt 客户端,然后将哈希发送到服务器吗?

node.js - 在 NodeJS 应用程序中存储远程 API 的身份验证 token 的最佳方法是什么?

c# - Task<T> 是否真的减少了使用的线程数?

c# - 基于等待任务的队列

.net - Task 对象只能用于线程池线程吗?

javascript - 在返回函数变量之前如何等待 promise 完成?

javascript - 不确定为什么这个 jQuery 点击事件在这里被触发