js执行机制事件循环,js响应事件

  js执行机制事件循环,js响应事件

  本文通过分析一段代码的打印顺序,让你深入了解javascript中的事件执行机制,希望对你有所帮助!

  前段时间做了个测试,有点迷茫。今天深入分析一下JS的事件执行机制。【相关推荐:javascript学习教程】

  

先看一段代码

  你可以试着写出打印顺序。

  

单线程

   Js主要作为浏览器的脚本语言。JS的主要目的是操作DOM,这就决定了JS必须是单线程的。如果JS像Java一样是多线程的,如果两个线程同时操作DOM,浏览器应该如何执行?

  JS的发布其实是为了蹭Java的人气,其中写这种语言的时间比较短,所以JS是单线程的原因。

  

JS执行机制

   JS既然是单线程,就必然要对任务进行排序。所有的任务都将按照一个规则来执行。

  同步任务

  异步任务

  当同步任务和异步任务进入执行堆栈时,JS会先判断任务的类型。

  这是一个同步任务。直接转到主线程。

  是一个异步任务,进入事件表并注册回调函数事件队列。

  当所有同步任务完成后,JS将读取事件队列中的函数并执行它。

  这个过程将一直重复,直到所有任务完成。这就是我们常说的事件循环。

  

JS如何判断执行栈为空

   emmmm,不知道。JS应该有自己独特的逻辑来判断执行栈是否为空。

  

异步任务

  异步任务执行顺序为:宏任务3354微任务。

  异步任务可以分为

  宏任务

  微任务

  

常见的宏任务

  输入/输出

  定时器

  设置间隔

  

常见的微任务

  承诺。然后。捕捉

  

答案

  在Vite之前配置的一个插件的版本有些问题。不要担心这个红色警报。

  

分析

  作为同步任务启动,首先进入执行堆栈。

  执行task()函数,A是同步任务,进入执行栈。

  Async/await是异步到同步的过程,第一行代码会同步执行,后面的代码是异步的。b作为同步任务进入执行堆栈。

  End变成异步任务的微任务,进入执行栈。

  目前为止,同步任务队列依次是 开始了, a, b

  目前为止,异步任务队列依次是 宏任务: setTimeout 微任务:a end

  

如果没有后续代码,打印顺序如下

  那么问题来了,不是宏观任务会比微观任务执行的早吗?为什么setTimeout在结束后打印?

  看这张照片。

  SetTimeout作为宏任务进入任务队列。所以这就是原因。

  一般来说:

  Asycawait导致了微任务的出现,但是这个微任务属于当前的宏任务。因此,会先执行一个end,然后判断当前宏任务是否完成。执行下一个宏任务并打印出setTimeout。

  

继续走流程

   c由于承诺的改变,同步任务进入任务队列。

  End作为Promise派生的微任务进入任务队列。

  d .作为同步任务进入任务队列。

  

目前为止,同步任务队列

   a

  b

  c

  d

  

目前为止,异步任务队列

  结束微任务

  结束微任务

  SetTimeout宏任务

  所以打印顺序如下

  

后记

  你自己对JS执行机制的理解可能有些不准确。我希望你能指出他们。

  【相关视频教程推荐:web前端】以上是深入分析下JS中事件执行机制的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: