• 学习之Event Loop


    写在前面

    Event Loop(事件循环),是大多数面试会问到的问题,我也遇到几次,都是胡乱回答,后面想来,感觉好蠢。今天又看到一篇文章,索性给它来个总结,便于日后复习(面试)。

    什么是Event Loop

    个人的理解,JavaScript是单线程的,遇到许多耗时的操作,就会阻塞,为了解决这个,所有就有异步。那么这个异步操作是怎么执行的,就是Event Loop的核心知识点。

    关于Event Loop

    Event Loop,中文名叫事件循环,拆分一下为event和loop,event为事件,可以理解为动作,就是浏览器需要做某个动作,比如点击鼠标,操作dom等。loop理解为循环,队列,即浏览器做这些动作,是有个先后顺序的。常见的顺序:先进先出(FIFO),后进先出(LIFO),浏览器中遵循的顺序是:宏任务-微任务为一个执行顺序,即一个循环,浏览器不断的执行这样的循环,就是Event Loop。

    宏任务 与 微任务

    宏任务macro task:包括整体代码script,setTimeout,setInterval

    微任务micro task:Promise,process.nextTick(nodejs)

    栗子

    先来几个栗子尝尝鲜

    1 console.log(1);
    2 setTimeout(function() {
    3     console.log(2);
    4 })
    5 console.log(3);

    setTimeout是宏任务,那么执行时会放在事件循环里面,可以理解为异步执行的,js执行顺序是先执行完同步再执行异步,所以执行顺序是1,3,2

    下一个

     1 console.log(1);
     2 setTimeout(function() {
     3     console.log(2)
     4 });
     5 new Promise(function(resolve) {
     6     console.log(3);
     7     resolve();
     8 }
     9 ).then(function() {
    10     console.log(4)
    11 });
    12 console.log(5);

    这里出现了promise,属于是微任务,同时也有setTimeout,属于是宏任务,这里需要注意一个点,就是promise里面的是立即执行的,可以理解为同步。由于执行顺序是宏任务-微任务,因为整体代码片段是一个宏任务,所以执行整段代码后会执行promise.resolve,所以执行顺序是1,3,5,4,2

    下一个

     1 console.log('1');
     2 setTimeout(function() {
     3     console.log('2');
     4     process.nextTick(function() {
     5         console.log('3');
     6     })
     7     new Promise(function(resolve) {
     8         console.log('4');
     9         resolve();
    10     }).then(function() {
    11         console.log('5')
    12     })
    13 })
    14 process.nextTick(function() {
    15     console.log('6');
    16 })
    17 new Promise(function(resolve) {
    18     console.log('7');
    19     resolve();
    20 }).then(function() {
    21     console.log('8')
    22 })
    23 setTimeout(function() {
    24     console.log('9');
    25     process.nextTick(function() {
    26         console.log('10');
    27     })
    28     new Promise(function(resolve) {
    29         console.log('11');
    30         resolve();
    31     }).then(function() {
    32         console.log('12')
    33     })
    34 })

    先看总体,1是同步执行没毛病,然后再根据宏任务-微任务,接下来就应该是promise,nextTick(nodejs),执行完微任务,再找宏任务,即setTimeout,再找微任务,再找宏任务....一直到事件循环结束
    那么这里的执行顺序应该是:1(同步),7(立即执行),6(微任务),8(微任务),2(宏任务),4(立即执行),3(微任务),5(微任务),9(宏任务),11(立即执行),10(微任务),12(宏任务)

    写在最后

    以上为本人学习观点,例子来自于网络,如果有不正确的地方欢迎提出指正。

  • 相关阅读:
    流浪西邮之寻找火石碎片
    给你一个666
    似魔鬼的步伐
    括号匹配2019
    挑剔程度
    到底有到少个小和尚?
    获取任务栏所有正在运行程序
    EXTJS4创建多级菜单
    关于时间的一些理解
    kof97调隐藏人物
  • 原文地址:https://www.cnblogs.com/xuejiangjun/p/15261765.html
Copyright © 2020-2023  润新知