• Node当中的事件循环


    事件循环

    1. 浏览器的事件循环标准是由 HTML 标准规定的,而NodeJS中事件循环其实略有不同

    2. 每一个浏览器都至少有一个事件循环,一个事件循环至少有一个任务队列。循环指的是其永远处于一个“无限循环”中。不断将注册的回调函数推入到执行栈。

    为什么要有事件循环

    const bar = () => console.log('bar')
    const baz = () => console.log('baz')
    const foo = () => {
      console.log('foo')
      bar()
      baz()
    }
    foo()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    它的输出是
    在这里插入图片描述
    以上一段简单的JS代码,究竟是怎么被浏览器执行的?

    首先,浏览器想要执行JS脚本,需要一个“东西”,将JS脚本(本质上是一个纯文本),变成一段机器可以理解并执行的计算机指令。这个“东西”就是JS引擎,它实际上会将JS脚本进行编译和执行.

    v8引擎有两个非常核心的构成,执行栈。执行栈中存放正在执行的代码,堆中存放变量的值,通常是不规则的。

    V8运行此代码时,会首先调用 foo()。 在 foo() 内部,会首先调用 bar(),然后调用 baz()

    此时,调用栈如下所示:
    在这里插入图片描述
    在这里插入图片描述
    调用 foo 时,第一个帧被创建并压入栈中,帧中包含了 bar 的参数和局部变量。 当 foo 调用 bar 时,第二个帧被创建并被压入栈中,放在第一个帧之上,帧中包含 bar 的参数和局部变量。当 bar 执行完毕然后返回时,第二个帧就被弹出栈(剩下 foo 函数的调用帧 )当foo调用baz时,和第二帧同理. foo也执行完毕然后返回时,第一个帧也被弹出,栈就被清空了。

    事件循环机制

    在这里插入图片描述
    1.微任务
    这里说的微任务(microtasks)其实是一个统称,包含了两部分:

    • process.nextTick() (node专属) 注册的回调
    • promise.then() 注册的回调

    2.宏任务

    • setTimeout 注册的回调
    • setInterval 注册的回调
    • setImmediate (node专属)注册的回调
    • I/O 注册的回调
    • script(整体代码)
    • requestAnimationFrame (浏览器独有)
    • UI rendering (浏览器独有)
  • 相关阅读:
    如何在Spring Boot应用中使用Nacos实现动态更新数据源
    详解设计模式:状态模式
    学习笔记(15)跨域
    MySQL下载步骤详解
    sqoop笔记(安装、配置及使用)
    海量数据处理方法归纳
    LabVIEW面向对象-面向对象
    使用百度飞桨 EasyDL 完成垃圾分类
    科技云报道:云安全的新战场上,如何打破“云威胁”的阴霾?
    Webpack和Vite
  • 原文地址:https://blog.csdn.net/weixin_51610980/article/details/126664575