zoukankan      html  css  js  c++  java
  • js事件循环机制(EVENTLOOP)

    JS的执行机制是一个主线程和一个任务队列(Eventqueue),所有的同步任务都是在主线程上直接执行的。异步任务都被放在任务队列中。这时程序的执行还没有真正的进入事件循环。

    接下来异步任务的执行,就涉及到了宏任务和微任务。

    所有的任务在主线程执行,会形成一个执行栈,执行栈会区分出宏任务和微任务,并把任务放在各自的任务队列中。

    宏任务一般包括整体SCRIPT代码块,seiTimeout,setInterval。

    微任务:promise的then方法,process,nextTick。

    所有的异步任务都会被分为宏任务和微任务。宏任务队列一次只会存放一个宏任务,当宏任务队列的任务执行完后,会执行所有的微任务。所有微任务执行完后,会进入下一个事件循环。

    这是宏任务队列会进入下一个宏任务,并执行这个宏任务。

    接下来在看一个逻辑图来加深一下理解。

    一个宏任务执行完后,执行所有的微任务,所有的微任务执行完后,再次开始执行下一个进入宏任务队列的宏任务。这个过程就是一次事件循环。

    所有任务的执行就形成整个的事件循环。大家可以读一下下面的代码,看看你是不是真的已经理解了事件循环。

     1 setTimeout(function(){
     2     console.log('1')
     3 });
     4 
     5 new Promise(function(resolve){
     6     console.log('2');
     7     resolve();
     8 }).then(function(){
     9     console.log('3')
    10 });
    11 
    12 var timer;
    13 timer = setInterval(function(){
    14     console.log('5');
    15     clearInterval(timer);
    16 });
    17 new Promise(function(resolve){
    18     resolve();
    19 }).then(function(){
    20     console.log('6')
    21 });
    22 console.log('4');

    这段代码的执行结果是2,4,3,6,1,5。首先来分析一下思路,整体的代码是第一个执行的宏任务,整体代码开始执行,同步任务直接在主线程执行执行,此时打印出2,4。(Promise参数是一个同步执行的函数)

    接下来执行所有的微任务,有两个Promise的then函数,按顺序执行,打印出3,6。微任务执行完,下一个宏任务进入宏任务队列,开始被执行,打印出1。接下来没有微任务,直接执行下一个宏任务,打印出5。

  • 相关阅读:
    druid连接池的配置和应用
    Maven的Unknow错误
    实践——WebStorm安装(2021/01/30)(更新2021/07/14,添加激活码和习惯设置)
    vue3如何编写挂载DOM的插件
    npm 安装源
    一个node项目的docker镜像制作
    圣女
    基于计算机视觉的车牌识别系统(一)
    vue3 兄弟组件传参mitt
    laravel-admin 加载样式失败
  • 原文地址:https://www.cnblogs.com/langkezzz/p/10148621.html
Copyright © 2011-2022 走看看