javascript事件循环分为2种:一种是浏览器端事件循环,一种是node端事件循环。 此文只是捋一捋我对浏览器端事件循环的理解。

前言

我们都知道 JavaScript 是一门单线程语言,这意味着同一时间只能执行一个任务,结束了才能去执行下一个。如果前面的任务没有执行完,后面的任务就会一直等待。试想,有一个耗时很长的网络请求,如果所有任务都需要等待这个请求完成才能继续,显然是不合理的并且我们在浏览器中也没有体验过这种情况(除非你要同步请求 Ajax),究其原因,是 JavaScript 借助异步机制来实现了任务的调度。

JavaScript 常见的异步有3种:ajax、dom事件(button的点击事件等)、定时器(setTimeout等)。

举个例子

console.log("A");setTimeout(() => {console.log("B");
}, 100);console.log("C");
复制代码

稍微了解一点浏览器中异步机制的同学都能答出会输出 “A C B”,我们来通过分析 event loop 来对浏览器中的异步进行梳理,并搞清上面的问题。

从上图我们可以看出js分为3个部分:stack(主线程)、WebAPIs、event loop。

浏览器的执行顺序是:

1.先执行主线程,即

console.log("A");setTimeout(() => {console.log("B");
}, 100);console.log("C");
复制代码

程序从上往下执行,但是执行到setTimeout时,只是注册了一个WebAPIs事件,并不会执行setTimeout的回调函数。 此回调函数是异步的,会在主线程的所有程序执行完毕后根据注册的时间才执行。

2.当主程序执行完毕后,就执行event loop。当然callback queue一开始是空的。event loop是一个‘死循环’,它会一遍又一遍的去检测WebAPIs有没有可执行的回调函数,有就把回调函数放入自身的callback queue并执行,没有的话继续下一次循环。

3.浏览器监听WebAPIs事件。过了100ms定时器事件触发了,它会通知event loop有可执行的回调函数了。

事件循环的一个必须条件是 执行栈中的任务执行完毕才会执行 “任务队列”中的任务,如果执行栈一直处于执行不完的情况,也就没有任务队列什么事了。所以我们的settimeout 后面的参数其实是不准确的,他开始算的时间应该是执行栈的任务执行完毕。

settimeout还有一个最小时间4ms的规定,所以当我们写settimeout(function(){},0)时,其中的0其实是4ms。

微任务和宏任务

首先说明,是以__浏览器为处理环境__下的执行逻辑 浏览器环境下的微任务和宏任务有哪些 宏任务:setTimeout setImmediate MessageChannel 微任务:Promise.then MutationObserver 记住两点:

  • 微任务在宏任务之前的执行,先执行 执行栈中的内容 执行后 清空微任务
  • 每次取一个宏任务 就去清空微任务,之后再去取宏任务

题目

setTimeout(function(){console.log('setTimeout1');Promise.resolve().then(()=>{console.log('then1');});
},0)
Promise.resolve().then(()=>{console.log('then2');Promise.resolve().then(()=>{console.log('then3');})setTimeout(function(){console.log('setTimeout2');},0)
})
复制代码
  • 微任务宏任务同时出现,先将微任务放入执行队列,栈为空则先执行then2。setTimeout1放入宏任务执行队列中
  • then2之后执行后,接下来存在微任务then3。将then3放入微任务队列中。
  • 接下来setTimeout2加入到宏任务队列中。
  • 此时执行栈为空,执行then3。
  • 微任务全部执行完毕后,执行宏任务setTimeout1,执行发现微任务then1,放置到微任务队列中。
  • setTimeout1宏任务执行完,再次清空微任务队列,执行then1
  • 微任务全部执行完毕后,执行宏任务setTimeout2。程序结束。

我理解的javascript事件循环(一)相关推荐

  1. onpaste事件不生效_从实际开发中来看JavaScript事件循环的使用场景

    前言: 本文是介绍结合DOM事件流和JavaScript事件循环解决一个工作中的实际问题的过程,很多东西不只是面试的时候才会用得到 文中涉及到的代码demo地址:drag-and-eventloop ...

  2. JAVA script 循环 图片_深入分析JavaScript 事件循环(Event Loop)

    事件循环(Event Loop),是每个JS开发者都会接触到的概念,但是刚接触时可能会存在各种疑惑. 众所周知,JS是单线程的,即同一时间只能运行一个任务.一般情况下这不会引发问题,但是如果我们有一个 ...

  3. dom更新到底在javascript事件循环的哪个阶段?「前端每日一题v22.11.17」

    dom更新到底在javascript事件循环的哪个阶段?「前端每日一题v22.11.17」 昨天写了一篇文章,是javascript的事件循环机制,然后在某乎上也发了,在发的时候看到了一个问题,dom ...

  4. JavaScript事件循环机制

    众所周知JS是一门单线程执行环境的语言,对于同步任务而言,同一时刻只能执行一个任务,后续的任务都要在当前执行的任务后面排队.这种模式在遇到一些执行时间较长的任务的时候就会出问题,会导致页面失去响应.所 ...

  5. [译] 深入理解 JavaScript 事件循环(二)— task and microtask

    引言 microtask 这一名词是 JS 中比较新的概念,几乎所有人都是在学习 ES6 的 Promise 时才接触这一新概念,我也不例外.当我刚开始学习 Promise 的时候,对其中回调函数的执 ...

  6. 对JavaScript事件循环机制的理解

    前言: 这次主要整理一下自己对 Js事件循环机制,同步,异步任务,宏任务,微任务的理解,大概率暂时还有些偏差或者错误.如果有,十分欢迎各位纠正我的错误! 一.事件循环和任务队列产生的原因: 首先,JS ...

  7. 笔试题——JavaScript事件循环机制(event loop、macrotask、microtask)

    今天做了一道笔试题觉得很有意义分享给大家,题目如下: setTimeout(()=>{console.log('A'); },0); var obj={func:function () {set ...

  8. JavaScript事件循环详解

    做为一个前端开发,要想深入学习JavaScript进阶知识,就不得不了解JavaScript的事件循环.JavaScript的事件循环抽象,不易理解,谁都可以说出单线程,宏任务,微任务,但大部分人只是 ...

  9. JavaScript 事件循环:从起源到浏览器再到 Node

    浏览器渲染. ▐  案例分析 根据上述的处理模型,我们可以来看以下例子: console.log('script start'); setTimeout(function() { console.lo ...

最新文章

  1. MySql第几行到第几行语句
  2. 5、Linux-Mac配置环境变量
  3. 全面涵盖传统方法和深度学习方法:3D人脸识别的十年发展及未来趋势
  4. Remoting简介
  5. docker容器的本地局域网yum源优化
  6. java使用varargs,Java 实例 – Varargs 可变参数使用 - Java 基础教程
  7. linux中make的用法
  8. 指出Linux内核中boot,uBoot和Linux内核中涉及到的几个地址参数的理解
  9. 读者试读怎么评价这本书
  10. Foobar2000是一款完全可定制的音乐播放器
  11. 禁用计算机端口,电脑如何关闭445端口
  12. 曲线运动与万有引力公式_物质自旋与力的形成 ——关于万有引力与磁荷力本质与统一问题的探讨...
  13. 2022年诺贝尔物理学奖背后的故事——贝尔不等式诞生之后
  14. OpenNLP中关于语言检测的语料训练
  15. 鸿蒙系统一体机使用教程,华为视频会议系统TE30(华为新一体机)(示例代码)
  16. Altium Designer20 PCB规则设置
  17. servlet实现统计网站访问量
  18. Vue2:使用Vant UI实现网易云评论页上拉和下拉刷新
  19. 关键业务服务器存在的“硬道理”
  20. 拼多多用户优惠券使用行为预测分析项目

热门文章

  1. C#学习小记12实现一个接口
  2. vim常用替换表达式
  3. UA OPTI512R 傅立叶光学导论16 Nyquist-Shannon采样定理
  4. Julia程序设计3 数组2 排序、复制、集合运算、字典
  5. UA MATH575B 数值分析下IV 带约束的优化
  6. Linux 查看I/O端口地址分配
  7. Java——重载和重写
  8. 纠缠于沉没成本—— 你为什么应该忽视过去
  9. select2 api参数的文档
  10. ubuntu命令安装jdk