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。

  • 相关阅读:
    CH the luckiest number 欧拉函数 同余
    bzoj1257余数求和 数论分块 暴力
    luogup1463 反素数
    CH3101 阶乘分解
    T10396 曹老板斗地主(中度模拟)
    NOIP 2015子串(DP)
    CF1205B Shortest Cycle(Floyd判最小环)
    P2055 [ZJOI2009]假期的宿舍(二分图匹配)
    灾后重建(最短路)
    CF1098A Sum in the tree(贪心)
  • 原文地址:https://www.cnblogs.com/langkezzz/p/10148621.html
Copyright © 2011-2022 走看看