Github上最受欢迎的7个编程面试项目
现在什么是事件循环?事件循环连续运行(在浏览器运行时中,它并不总是在节点中运行)以检查调用栈是否为空,如果调用栈为空,它将从回调队列中提取第一项并将其移至调用栈并执行回调函数。在堆栈不为空之前,不会从回调队列添加任何功能。 回调总是完全执行的。事件循环一次运行一个回调。没有上下文切换。队列中的所有回调都必须等到当前的回调完成。如果脚本运行时间过长,则会阻止其他脚本。这就是为什么回调应该相对简短而简单。 很简单吧!但实际上,它要复杂得多。有多个队列,具体取决于运行时,并且它们的优先级不同。有一些东西作为渲染队列。谁的工作是渲染屏幕。 非阻塞状态如何? 假设您在调用API时失败,或者发生了其他事件,该事件仍然存在于Web api中,因此它永远不会进入回调队列,因此不会进入调用堆栈。因此,没有任何东西被阻止。 它是并发的吗?
并行和并行有什么区别?并行是您同时执行2个任务的位置。(边吃爆米花边看电影)。这是通过多核来实现的。JS代码在调用堆栈中并行执行,而不是并行执行。但是WebAPI可以利用多核并并行运行。 所有这些都转到调用堆栈并在那里执行。
我们可以将脚本分为两种类型,即立即调用和稍后调用。 异步任务到来时会发生什么?任务需要时间才能运行。比如说进行API调用或计时器等。有一个称为回调的概念。这是完成此任务后要执行的功能。 好吧,它们作为任何常规函数进入调用堆栈,但是由于此任务驻留在WebAPI中,因此我们对WebAPI进行了调用。它存储任务的回调函数并为我们完成任务(根据运行时使用线程/多处理)。任务完成后,它将回调发送到回调队列。
在这里再次可视化。 让我们看看Javascript是如何异步和单线程的。 单线程,什么? Javascript代码在单线程中执行,但是Javascript运行时不在单线程中运行。线程池存在于JS运行时中,但是我们不必担心它,因为运行时会处理它。但是,那是怎么做的呢?事件循环可以挽救。
让我们了解什么是运行时(或属于运行时的JS引擎)中的堆和调用堆栈。javascript代码首先转换为机器代码。堆存储所有变量,并由调用堆栈执行操作。 (编辑:唐山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |