gpt4 book ai didi

javascript - JavaScript 中的多线程或异步代码如何工作?

转载 作者:行者123 更新时间:2023-11-29 16:07:58 25 4
gpt4 key购买 nike

我不是 javascript 的初学者。在过去的 3-4 个月里,我实际上一直在研究这个问题,但今天我读到了关于“什么是 JavaScript?”的声明

JavaScript is single-threaded, non-blocking, asynchronous, concurrent language.

我迷路了。如果 JavaScript 是单线程的,它怎么可能是并发的,又怎么可能是异步的,因为你需要跟踪你的异步代码在做什么,如果没有另一个线程,不可能同时跟踪 2 个或更多代码?

最佳答案

啊..事情是这样的:

JavaScript 是单线程的,但它有很多空闲时间。

当它正在等待从网络加载某些内容,或等待从磁盘上下载某些内容或等待操作系统将某些内容交还给它时,它可以运行其他代码。

setTimeout(function() {
// Do something later.
}, 1000);

在等待超时返回并执行该代码时,它可以运行来自其他超时、网络调用或系统中任何其他异步代码的代码。然而,它一次只运行一个代码块,这就是我们说它是单线程的原因。

该线程可以反弹。很多。

而且,正如其他人所说,有网络工作人员和服务工作人员,但它们的运行与您的主线程非常隔离。他们无法在您的主线程背后更改值。

根据评论更新

事件循环的工作原理是:

  • 等待事件
  • 处理该事件。

JavaScript 在处理 事件时确实被阻塞了。当代码运行时,该页面中的任何其他内容(假设浏览器主线程)都不能运行。

它不是像在 C 或 C++ 中那样的文字 事件循环,就 JS 而言不是。这只是等待发生的事件。

/// Sample code
document.addEventListener("click", function() { /* Handle click */ });

window.addEventListener("load", function() { /* handle load */ });

在这种情况下,我们的代码中有两个事件监听器。 JS 引擎将编译,然后执行这两个语句。然后,为了所有意图,在等待某事发生时“ sleep ”。 实际上,同一个线程可能会处理各种内务处理任务,例如绘制 HTML 页面、监听移动 Action 和发出各种事件,但这对本次讨论而言并不重要。

然后,一旦页面的其余部分加载完成,浏览器将发出一个 load 事件,该事件将被监听器捕获并运行更多代码。

然后它会回到空闲状态,直到有人点击文档,然后会运行更多代码。

如果我们把代码改成这样:

document.addEventListener("click", function() {
while(true);
});

然后当有人点击该文档时,我们的线程将进入无限循环,并且该窗口中的所有浏览器事件都将停止。甚至可能卡住整个浏览器,具体取决于您运行的浏览器。

最终,浏览器将有机会终止该任务,以便您可以恢复系统。

关于javascript - JavaScript 中的多线程或异步代码如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36233028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com