我理解的javascript事件循环(一)
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事件循环(一)相关推荐
- onpaste事件不生效_从实际开发中来看JavaScript事件循环的使用场景
前言: 本文是介绍结合DOM事件流和JavaScript事件循环解决一个工作中的实际问题的过程,很多东西不只是面试的时候才会用得到 文中涉及到的代码demo地址:drag-and-eventloop ...
- JAVA script 循环 图片_深入分析JavaScript 事件循环(Event Loop)
事件循环(Event Loop),是每个JS开发者都会接触到的概念,但是刚接触时可能会存在各种疑惑. 众所周知,JS是单线程的,即同一时间只能运行一个任务.一般情况下这不会引发问题,但是如果我们有一个 ...
- dom更新到底在javascript事件循环的哪个阶段?「前端每日一题v22.11.17」
dom更新到底在javascript事件循环的哪个阶段?「前端每日一题v22.11.17」 昨天写了一篇文章,是javascript的事件循环机制,然后在某乎上也发了,在发的时候看到了一个问题,dom ...
- JavaScript事件循环机制
众所周知JS是一门单线程执行环境的语言,对于同步任务而言,同一时刻只能执行一个任务,后续的任务都要在当前执行的任务后面排队.这种模式在遇到一些执行时间较长的任务的时候就会出问题,会导致页面失去响应.所 ...
- [译] 深入理解 JavaScript 事件循环(二)— task and microtask
引言 microtask 这一名词是 JS 中比较新的概念,几乎所有人都是在学习 ES6 的 Promise 时才接触这一新概念,我也不例外.当我刚开始学习 Promise 的时候,对其中回调函数的执 ...
- 对JavaScript事件循环机制的理解
前言: 这次主要整理一下自己对 Js事件循环机制,同步,异步任务,宏任务,微任务的理解,大概率暂时还有些偏差或者错误.如果有,十分欢迎各位纠正我的错误! 一.事件循环和任务队列产生的原因: 首先,JS ...
- 笔试题——JavaScript事件循环机制(event loop、macrotask、microtask)
今天做了一道笔试题觉得很有意义分享给大家,题目如下: setTimeout(()=>{console.log('A'); },0); var obj={func:function () {set ...
- JavaScript事件循环详解
做为一个前端开发,要想深入学习JavaScript进阶知识,就不得不了解JavaScript的事件循环.JavaScript的事件循环抽象,不易理解,谁都可以说出单线程,宏任务,微任务,但大部分人只是 ...
- JavaScript 事件循环:从起源到浏览器再到 Node
浏览器渲染. ▐ 案例分析 根据上述的处理模型,我们可以来看以下例子: console.log('script start'); setTimeout(function() { console.lo ...
最新文章
- MySql第几行到第几行语句
- 5、Linux-Mac配置环境变量
- 全面涵盖传统方法和深度学习方法:3D人脸识别的十年发展及未来趋势
- Remoting简介
- docker容器的本地局域网yum源优化
- java使用varargs,Java 实例 – Varargs 可变参数使用 - Java 基础教程
- linux中make的用法
- 指出Linux内核中boot,uBoot和Linux内核中涉及到的几个地址参数的理解
- 读者试读怎么评价这本书
- Foobar2000是一款完全可定制的音乐播放器
- 禁用计算机端口,电脑如何关闭445端口
- 曲线运动与万有引力公式_物质自旋与力的形成 ——关于万有引力与磁荷力本质与统一问题的探讨...
- 2022年诺贝尔物理学奖背后的故事——贝尔不等式诞生之后
- OpenNLP中关于语言检测的语料训练
- 鸿蒙系统一体机使用教程,华为视频会议系统TE30(华为新一体机)(示例代码)
- Altium Designer20 PCB规则设置
- servlet实现统计网站访问量
- Vue2:使用Vant UI实现网易云评论页上拉和下拉刷新
- 关键业务服务器存在的“硬道理”
- 拼多多用户优惠券使用行为预测分析项目