您的问题标题和问题正文似乎在问两个不同的问题。我会尝试解决这两个问题。
身体问题
异步不是 John 创造的术语,甚至不是 JavaScript 特定的术语。它在计算机科学中具有既定的含义。尽管约翰所说的是准确的,但我认为它是不完整的。他正确地解释了为什么我们使用术语异步(词源),但没有解释什么是异步编程。
在计算机科学中,异步意味着暂停执行代码,允许其他(任意)代码在同一线程中运行,并最终恢复暂停的代码。有很多技术可以实现这一点,也有很多方法可以为程序员抽象出来,但它们都具有暂停代码而不是阻塞的特征。这用于避免在等待一些慢速资源(如 HTTP 请求、文件或数据库)时阻塞整个线程。
例如,如果您要发出一个同步HTTP 请求,那么在请求完成之前没有其他 JavaScript 可以运行。因此,任何依赖于 JavaScript 的网页部分都会被冻结。但是,如果您发出异步HTTP 请求,则发出请求的代码可以在等待请求时暂停。这允许其他代码执行。并且在 HTTP 请求完成后,请求代码可以恢复。
John 说异步代码可以发生的原因是任何顺序,因为我们不知道外部资源何时可用。例如,如果您发出两个或多个异步 HTTP 请求,则无法知道请求将以什么顺序完成(因此,代码将恢复的顺序)。
标题问题
浏览器事件是异步的,就像我们的示例 HTTP 请求一样。事实上,在很多方面用户只是作为其他外部资源。用户将在自己的时间做事,与当前正在执行的代码异步。
例如,如果您的代码为页面上按钮的单击事件定义了一个处理程序。您的 JavaScript 代码不会等待用户单击按钮。它为单击处理程序挂起该代码,并在用户单击按钮时稍后执行它。这就是为什么异步编程在 JavaScript 中如此重要的核心。如果您的代码只是阻塞(等待)直到该 HTTP 请求完成,则用户无法单击该按钮。如果您的代码在等待用户单击某些内容时被阻塞,那么您的 HTTP 请求将超时。
最后的想法
在 JavaScript 中,我们通常不会考虑暂停和恢复代码。事实上,您不能只是在正在运行的代码块中间暂停。该块将始终在执行其他任何操作之前完成。相反,我们将回调从我们的代码块中传递出来,以便稍后执行。这些回调可以同时访问原始代码块中的资源(范围)。回调是从原始上下文恢复的内容。
如果您想深入了解 JavaScript 如何管理并发模型和事件循环,这是一个很好的资源。此外,除了回调之外,JavaScript 还为事件循环添加了一些强大的抽象,例如Promises和Generators。这些值得花一些时间。