美文网首页
JS事件循环机制

JS事件循环机制

作者: 不困于情 | 来源:发表于2019-02-26 10:26 被阅读5次
事件循环
开局一张图

1、事件循环

图中heap表示堆和stack表示执行栈,web apis表示一些异步事件,callback queue表示事件队列。
大致意思是这样的:

  • js引擎遇到一个异步事件后并不会一直等待其返回结果,而是会将这个事件挂起,继续执行执行栈中的其他任务。当一个异步事件返回结果后,js会将这个事件加入与当前执行栈不同的另一个队列,我们称之为事件队列。
  • 被放入事件队列不会立刻执行其回调,而是等待当前执行栈中的所有任务都执行完毕, 主线程处于闲置状态时,主线程会去查找事件队列是否有任务。如果有,那么主线程会从中取出排在第一位的事件,并把这个事件对应的回调放入执行栈中。
  • 然后执行其中的同步代码...,如此反复,这样就形成了一个无限的循环。这就是这个过程被称为“事件循环(Event Loop)

2、微任务(micro task)和宏任务(macro task)。

以下事件属于宏任务:
setInterval()
setTimeout()

以下事件属于微任务:
new Promise()
new MutaionObserver()

前面我们介绍过,在一个事件循环中,异步事件返回结果后会被放到一个任务队列中。然而,根据这个异步事件的类型,这个事件实际上会被对应的宏任务队列或者微任务队列中去。并且在当前执行栈为空的时候,主线程会 查看微任务队列是否有事件存在。如果不存在,那么再去宏任务队列中取出一个事件并把对应的回到加入当前执行栈;如果存在,则会依次执行队列中事件对应的回调,直到微任务队列为空,然后去宏任务队列中取出最前面的一个事件,把对应的回调加入当前执行栈...如此反复,进入循环。

我们只需记住当当前执行栈执行完毕时会立刻先处理所有微任务队列中的事件,然后再去宏任务队列中取出一个事件。同一次事件循环中,微任务永远在宏任务之前执行。

这样就能解释下面这段代码的结果:
宏任务、微任务、同步任务的执行顺序

setTimeout(function () {
    console.log(1);
});

new Promise(function(resolve,reject){
    console.log(2)
    resolve(3)
}).then(function(val){
    console.log(val);
})
console.log(4);
// 2
// 4
// 3
// 1

相关文章

  • js事件循环

    js 是单线程的, js 的异步事件就是依赖于事件循环机制 事件循环 首先,我们来解释下事件循环是个什么东西: 就...

  • 2019-03-28

    JS 事件循环机制 - 任务队列、web API、JS主线程的相互协同 这篇文章的核心是分析js的事件循环,在此我...

  • Vue源码分析—响应式原理(四)

    nextTick JS 运行机制 JS 执行是单线程的,它是基于事件循环的。事件循环大致分为以下几个步骤: 所有同...

  • node 事件

    1、事件 1.1普通事件的使用 1.2、Node.js 的事件循环机制解析 1)Node 由事件循环开始,到事件循...

  • js 事件循环机制

    事件循环机制: 以任务队列形式,同步任务,异步任务 同步任务:在主线程上排队的任务,前一个执行完,执行后一个 异步...

  • js事件循环机制

    程序开始执行之后,主程序开始执行同步任务,碰到异步任务就把它放到任务队列中,等到同步任务全部执行完之后,js引擎就...

  • js 事件循环机制

    日期:2020 年 7 月 10 日 js 事件循环机制 前言 众所周知,JavaScript 是一门 单线程 的...

  • JS事件循环机制

    1、事件循环 图中heap表示堆和stack表示执行栈,web apis表示一些异步事件,callback que...

  • js事件循环机制

    基本知识 js是单线程的,只有一个主线程处理逻辑 事件循环的作用 保证主线程, 有序并高效 或非阻塞 的处理 在j...

  • js事件循环机制

    1. 什么是事件循环? js引擎并不是独立运行的,它运行在宿主环境中,对多数开发者来说通常就是web浏览器。经过最...

网友评论

      本文标题:JS事件循环机制

      本文链接:https://www.haomeiwen.com/subject/emvoyqtx.html