如果默认情况下 JavaScript 既不是 Asynchronous 也不是 Multi-Threaded,为什么新手通常认为是(尤其是与其他语言相比)?

If JavaScript is neither Asynchronous nor Multi-Threaded by default, why do novices usually assume that is (especially compared to other languages)?

根据这个问题的标题...为什么 JavaScript 看起来 与 Java 如此不同? 似乎 是有效的主观连接动词...

本质上,为什么新手经常假设Java脚本默认是异步的?与从未做出这种假设的 Java 相比,导致初学者做出这种假设的 Java 脚本的质量如何?这与浏览器事件循环中的并发性有关吗?

Java 和 JavaScript 是两种 不同的 语言,尽管在语法和命名法上有一些相似之处,但设计​​和操作方式大不相同。 (JavaScript 是 Mozilla 对 ECMAScript 规范的实现,尽管它的口语用法类似于 "Xerox" 或 "Saran Wrap"。)

Java支持多线程; JavaScript (ECMAScript) 规范确实定义了线程或多线程。

JavaScript OO 是基于原型的,方法是未绑定的; Java 基于消息,所有方法都绑定到对象。

Java脚本是动态的(通常是弱类型的); Java 是静态强类型的。

Java脚本解释是直接执行源代码; Java必须先编译

有一个问题突出显示为 "really out of place",所以我会回答这个问题(而且只回答那个问题):

Essentially, why do novices often assume that JavaScript is asynchronous by default? What is the quality of JavaScript that leads beginners to make this assumption compared to Java, where such an assumption is never made?

JavaScript(以下简称 ECMAScript 或 ES)主要用于两个目的:

  1. 网站(或其他浏览器托管)和;
  2. node.js.

在这两种情况下,底层主机基础设施的存在是为了利用 ES 对first-class 函数和闭包的支持:浏览器交互事件、setTimeout、AJAX、Web Worker 以及 Node.

中的大量异步支持

(异步编程不需要 first-class 函数和闭包;它们只是在 JavaScript 中实现 'really easy'。)

因此,大多数程序员从来不知道宿主支持允许异步编程的本机构造的环境;并且对异步回调的支持 used/required 让大多数程序都感兴趣。

但是,如果主机公开任何异步方法,那么"asynchronous by default"将显示为附加利用ES语言特性:

ES 程序执行始终同步(这就是回调必须运行完成且不能被抢占的原因)尽管这些微小的同步块可以交错。