首页 > 解决方案 > PURE Javascript 是同步的还是异步的?

问题描述

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

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

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

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

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

标签: javascriptnode.jsasynchronoussynchronization

解决方案


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

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

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

我不明白的是,当我谷歌“是 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 或工作线程)Javascript 在一个线程中运行您的 Javascript 代码,但它可以访问非阻塞 I/O 函数,这些函数允许操作与您的 Javascript 并行运行。在浏览器中,您可以对服务器进行 Ajax 调用,然后在 Ajax 调用完成时执行其他操作(进行一些计算、更新屏幕、更新屏幕上的时钟等),然后在完成时通知从 Ajax 调用到达,您可以处理结果。虽然您的实际 Javascript 行一个接一个地同步运行,但您可以启动异步操作,从而在 Javascript 执行的同时运行一些事情。我将避免争论是否要称其为“


推荐阅读