一、浏览器JS异步执行的原理

一般常说js是一门单线程语言,那为什么可以异步执行且不发生阻塞呢?

  • 常说的JS是单线程语言,是因为执行JS的引擎是单线程的,而浏览器本身是多线程的
  • 浏览器主要含有:
    • js 执行线程
    • 定时器线程
    • http 请求线程
    • 事件触发线程
    • GUI 线程等
  • 异步请求的真正执行者是浏览器的其他线程
  • js 引擎只是执行了异步操作成功了之后的回调函数

二、事件循环机制

1 - 执行栈和任务队列

(1)执行栈是什么

  • 用于按执行顺序存放同步代码
  • 按序执行,执行完毕后弹出执行栈
  • 如果在执行过程中遇到异步操作,就交给其他线程处理

(2)任务队列

  • 用于按序排放异步操作执行结束后的回调函数
  • 任务队列中的函数等待执行栈执行结束后取出执行

2 - 事件循环的本质

  • 基于事件驱动模式
  • 至少包含了一个事件循环来判断当前的任务队列是否有新的任务
  • 通过不断的循环取出异步回调进行执行

3 - 宏任务和微任务

(1)宏任务的分类

  • 渲染事件
  • 用户交互事件
  • SetTimeout、setInterval
  • 网络请求、文件读写等

有明确异步操作的任务,需要其他的异步线程支持

(2)微任务的分类

  • promise.then promise.catch
  • process.nextTick

没有明确的异步任务需要执行,只有回调不需要其他异步线程的支持

(3)执行顺序

  • 在同步代码执行结束后
  • 先执行微任务队列中的微任务
  • 再执行宏任务队列中的宏任务

(4)案例

console.log('同步代码1');
setTimeout(() => {console.log('setTimeout')
}, 0)
new Promise((resolve) => {console.log('同步代码2')resolve()
}).then(() => {console.log('promise.then')
})
console.log('同步代码3');// 最终输出"同步代码1"、"同步代码2"、"同步代码3"、"promise.then"、"setTimeout"
setTimeout(() => {console.log('setTimeout start');new Promise((resolve) => {console.log('promise1 start');resolve();}).then(() => {console.log('promise1 end');})console.log('setTimeout end');
}, 0);
function promise1() {return new Promise((resolve) => {console.log('promise2');resolve();})
}
async function async1() {console.log('async1 start');await promise1();console.log('async1 end');
}
async1();
console.log('script end');// 输出结果
async1 start
promise2
script end
async1 end
setTimeout start
promise1 start
setTimeout end
promise1 end

4 - 定时器误差

(1)执行顺序

  • 遇到一个定时器请求,开启定时器线程去计时
  • 计时结束后将回调函数放入到任务队列(宏任务)
  • 等待同步任务执行 waiting… ,在同步任务执行结束后可能还有微任务
  • 同步任务执行结束后取出任务队列中的回调

(2)误差大小

  • 定时器的误差值取决于同步任务的执行时间 + 微任务的执行时间
  • 同步任务执行时间越长,定时器的误差越大

三、脑图总结

JS 常见面试题 - 事件循环机制相关推荐

  1. Node.js常见面试题

    Node.js常见面试题 1.NodeJS中的this为什么是一个空对象? 2.NodeJS中为什么可以直接使用exports.require.module.__filename.__dirname? ...

  2. vue.js 常见面试题_使用Vue.js时应避免的常见错误

    vue.js 常见面试题 Looking for a front-end framework to try out, I started with React and then tried Vue.j ...

  3. js常见面试题及简单回答

    一 h5新特性: 1, 新增了语义化标签 header,footer,article,aside,section,nav,hgroup,time,main等 2,新增表单控件 email,tel,ur ...

  4. js常见面试题(二)

    原型和原型链 原型链:当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造 ...

  5. 使用原生JS求一段字符串出现最多的次数和最少的次数,最大值和最小值(JS常见面试题)

    直接看代码(一把梭也可以): let strings = 'aqqwwqqaaasddvvccxxxx..........' let obj = {}; for (let i = 0; i < ...

  6. 前端常见面试题 - JS篇

    以下会是JS常见面试题: 面试题将会以系列不定时更新,编写不宜,如有用到,请动动小手关注一下. 1. 简述ES6 1. let: 块级作用域. 2. const: 常量; 块级作用域; 一旦声明, 则 ...

  7. js中如何得到循环中的点击的这个id_Js篇面试题9请说一下Js中的事件循环机制

    虽互不曾谋面,但希望能和您成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 标星公众号(ID:itclanCoder) 如果不知道如 ...

  8. Js篇-面试题9-请说一下Js中的事件循环机制

    虽互不曾谋面,但希望能和您成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 标星公众号(ID:itclanCoder) 如果不知道如 ...

  9. vue 离开页面事件_【必看】58 道 Vue 常见面试题集锦,涵盖入门到精通,自测 Vue 掌握程度...

    △ 是新朋友吗?记得先点web前端学习圈关注我哦- 1.vue优点? 答: 轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十 kb : 简单易学:国人开发,中文文档,不存在语言障碍 , ...

最新文章

  1. R语言ggplot2可视化为长文本轴标签自动换行美化可视化结构实战:Wrap long text axis labels
  2. 超简单破解网页加密源代码
  3. 《嵌入式 Linux应用程序开发标准教程(第2版)》——1.1 嵌入式Linux基础
  4. hive 语法检查_升级Hive3处理语义和语法变更
  5. JDK 8中的流驱动的集合功能
  6. ComponentName知识
  7. 全球约30%的智能手机受高通新漏洞影响,打补丁状况不明
  8. 第三个Sprint冲刺第十天
  9. minecraft java_minecraft java版本下载
  10. 制作pdf文档书签,自动生成or根据目录生成
  11. 基于MATLAB的数字图像处理-图像进行灰度化
  12. BootStrap 点击展示气泡框
  13. 干货丨Kubernetes 中分析调试网络流量的4种方法
  14. Java实现生成并下载Excel文件
  15. c语言随机数 抛硬币,C语言 抛硬币的问题
  16. A股个股财报数据更全面啦!—股票数据远程下载服务升级
  17. iframe页面的内嵌框架
  18. 获取Class的三种方法
  19. 凡解释一字即是做一部文化史
  20. KBEngine游戏服务器(一)——引擎源代码的获取和编译

热门文章

  1. 在mac上安装gradle(超详细,直接按步骤操作即可轻松搞定)
  2. 陌陌二季度财报发布,唐岩收购探探这步棋走得很妙
  3. CrossValidation 交叉验证和Stacking的深入理解
  4. Vue生命周期函数异步获取数据时的问题
  5. 别在折腾开发环境了,一劳永逸的 Python 环境搭建方法
  6. VUE实现的简单拼图游戏
  7. 伽玛函数:小数的阶乘(广义阶乘)
  8. 数据库查询语句 -- HAVING的用法
  9. 荣耀v20云计算机,荣耀V20云电脑功能体验,有多少朋友使用过?
  10. IDEA 打开项目后就闪退问题