【面试】javascript事件循环(Event Loop)

前端面试:JS中的Event Loop(事件循环)机制 阅读详情

1.javascript的单线程

javascript是单线程的。
单线程的意思就是说负责解释和执行javascript代码的线程只有一个,同一个时间内只能执行特定的一段js代码(当前任务)。
为什么javascript是单线程的?

1.js最初被设计出来及时作为一种浏览器脚本,主要负责和用户交互,操作dom. 

2.如果js是多线程的,那么就会带来非常复杂的同步问题:

   1.比如有两个线程,同时对一个dom操作,一个线程要删除,一个线程要在它上面添加属性,此时就有点不知所措

    2.有机制可以解决这种问题,但问题的复杂度也会上升

 

 2.Web Workers

随着web应用规模越来越大,越来越复杂的计算在所难免。

如果长时间运行一段复杂的js代码,会导致进程被阻塞,导致浏览器冻结用户界面,影响用户体验。

所以HTML5制定了Web Workers标准。

允许javascript创建多个线程,但是这些子线程会受到主线程的控制,且它们不得对DOM进行操作。

这样的话本质上并没有改变js单线程的本质 ,而且可以更好的利用多核CPU的性能,提高用户体验。

 

3.单线程的javascript如何实现异步?

 虽然负责解释和执行javascript代码的线程的只有一个。

但浏览器内部还有其他线程来专门负责异步任务的,比如定时器,UI,事件,网络之类专门的线程来负责相关任务的处理。

 

4.实现的逻辑(event loop)

1.javascript主线程会维护一个执行栈,然后逐行执行代码。

2.如果碰到异步代码(比如Promise.then,AJAX,setTimeout等等),那么它会把这些代码交给浏览器的其他相关的线程去执行,然后跳过这些代码继续往下执行,直到

   当前代码段结束。

3.同时浏览器的其他相关线程处理好该异步代码执行前需要的准备工作时(比如说AJAX数据,鼠标事件等触发,定时器的时间到了等)浏览器会把当前的异步代码放入一

   个异步任务队列中(queue先进先出)

4.每次当主线程逐行执行完当前代码时,都会去检查异步队列中是否有任务需要执行。如果有,那么就把那个任务拿出来再逐行执行,如果在其中有碰到了异步代码,那么再

   交给浏览器的其他线程去处理,然后跳过这些代码继续执行,直到当前代码结束。然后检查异步队列,如此循环往复,所以叫事件队列。

 

5.异步队列:Microtask(微任务)和Macrotask(宏任务)

 异步队列主要分为Microtask(微任务)和Macrotask(宏任务)队列。

Microtask(微任务):

  • process.nextTick
  • Promise
  • Object.observe
  • MutationObserve

Macrotask(宏任务):

  • setTimeout
  • setInterval
  • setImmediate
  • I/O
  • UI渲染
  • <script>中的js代码

 

 

6. Microtask(微任务)和Macrotask(宏任务)队列执行顺序

 宏任务队列和微任务队列依次执行,但是有一个重要的区别

当前微任务队列中的任务会被全部执行完。

当前宏任务队列中的任务只会挑队列中一个最先的任务执行,然后就跳到微任务。

 

7.描述微任务与宏任务交替执行

 <script>中的js代码会作为第一个宏任务执行。

因为队列是依次执行的,所以执行完宏任务会再执行微任务。

宏任务只会先执行最先的一个,再跳到微任务,把所有微任务都执行掉再跳到宏任务执行最先的一个。

 

8.任务的优先级

 idle观察者>I/O观察者>check观察者

process.nextTick(idle) > Promise(原生实现)

setTimeout(I/O) > setImmediate(check)

这个优先级会有差异,但如果时间为0,基本符合这个结果

 

9.任务优先级执行示例

 宏任务:先执行<script>中的代码,同步执行,因为promise构造函数是同步的,所以打印3,4,逐行执行打印6,8。

微任务:因为process.nextTick大于promise,所以打印7;然后执行promise.then方法,打印5。

宏任务:因为setTimeout(I/O) > setImmediate(check),所以打印2;完了之后跳到微任务队列,但微任务队列任务执行完了就不管了,直接直接宏任务,然后打印1.

        setImmediate(function(){
            console.log(1)
        },0)
        setTimeout(function(){
            console.log(2);
        },0);
        new Promise(function(resolve){
            console.log(3);
            resolve();
            console.log(4);
        }).then(function(){
            console.log(5);
        });
        console.log(6);
        process.nextTick(function(){
            console.log(7);
        });
        console.log(8);
//执行结果:3,4,6,8,7,5,2,1

 

  该博文参考改编自b站视频:https://b23.tv/BV1XW411H7X1

面试率 90% 的JS事件循环Event Loop,看这篇就够了!! ! 面试率 90% 的JS事件循环Event Loop,看这篇就够了!! ! 事件循环(Event Loop)大家应该并不陌生,它是前端极其重要的基础知识。在平时的讨论或者面试中也是一个非常高频的话题。 理解 JavaScript 的事件循环往往伴随着宏任务和微任务、JavaScript 单线程执行过程及浏览器异步机制等相关问题,而浏览器和 NodeJS 中的事件循环实现也是有很大差别。熟悉事件循环,了解浏览器运行机制将对我们理解 JavaScript 的执行过程和排查运行问题有很大帮助。 一、浏览器 JS 阅读详情

相关推荐

从0开始使用ArcGIS实现克里金(Kriging)插值(适用数学建模竞赛,详解)

适用:数学建模学习中遇到需要进行克里金(Kriging)插值的任务。希望尽快上手,选择出恰当的半函数模型,并获得插值后的图片。 详细步骤: 一、准备数据 在excel中准备需要进行克里金插值的内容,应该包括至少三列:X坐标,Y坐标,数据。在每一列的列首做好标记,方便导入ArcMap后对应。注意存储时存为xls文件。 二、将数据导如导ArcMap 点击下面这个标记,把数据文件添加到ArcMap。 如果是初次使用的化,可能会不知道进入添加数据对话框之后如何操作。这时应该先点击红框标记的图标,连接到文件夹。

east_fence的博客 4万+

script 的src一个用法

最近突然想要在一个页面A中传一个数据到页面B中, 但是页面A是不会打开的, 虽然有很多方法可以实现. 但是我不想用太复杂的东西, 想着有个src属性, 就像和里面的src一样, 可以用到url, 如果我页面显示的是javascript的代码呢, 能不能实现, 试试先. A.jsp"java" import="java.util.*" pageEncoding="UTF-8"%>

lin49940的专栏 4358

一文讲透3GPP TS 36.104发射链路相关指标

3GPP是制定移动通信标准的国际组织,其36.104规范对LTE基站射频性能提出详细要求。规范主要涵盖七方面:1)基站输出功率分类标准;2)LTE信道带宽计算方法;3)TD-LTE特有的发射机关断功率及时延要求;4)信号质量指标(频率误差和EVM)及其影响因素;5)邻道泄漏比(ACLR)的45dBc标准;6)带内频谱辐射模板(OBUE)的噪声限制;7)9kHz-12.75GHz频段的带外杂散辐射要求。这些技术要求保障了LTE基站的射频性能和网络质量。

weixin_49761275的博客 4526

前端高级面试题-彻底掌握JS事件循环原理

作者:石小明链接:https://segmentfault.com/a/1190000021710953前言为什么写这篇文章?因为这道题涉及了很多知识点:同步任务、异步任务、宏任务、微任...

前端开发博客 837

Wezterm的安装和简单配置

希望 wezterm 的主题配色,保持和 powershell 默认配色一致,也就是 Compell 主题。目的是在频繁使用 wezterm 时,原本的根据颜色判断文件信息(尤其是WSL里的Linux下,文件和目录颜色)依然可以使用。wezterm 默认用 cmd.exe, 我是 win11,希望默认用 powershell。

baiyu33的博客 4280

NSGA-III相关笔记

NSGA-III目录目的区别NSGA-III的算法流程非支配排序详解归一化详解 目录 NSGA-III基于matlab的实现 参考文献 1.An Evolutionary Many-Objective Optimization Algorithm Using Reference-point Based Non-dominated Sorting Approach,Part I: Solving P...

weixin_42555400的博客 1万+

javascript event loop 事件循环机制 面试例子

宏任务包括: setTimeout, setInterval, setImmediate(node独有), requestAnimationFrame(浏览器独有), UI rendering(浏览器独有), I/O, 微任务: process.nextTick(node独有,在微任务中是最先执行的), Promise.then(), Object.observe, MutationObserver 注意:Promise构造函数里的代码是同步执行的 一个函数执行栈,一个事件队列,一个微任务队列 宏任务队列一

weixin_44166439的博客 307

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

孤独的单刀 1627

面试必问之 JS 事件循环(Event Loop),看这一篇足够!!!

本文详细讲解了浏览器和 NodeJS 中事件循环的流程,虽然底层机制不一样,但在最终表现上是基本一致的。理解事件循环的原理,可以帮助我们准确分析和运用各种异步形式,减少代码的不确定性,在一些执行效率优化上也能有明确的思路。在前端面试中,事件循环相关的内容也是高频出现的技术点,理解它也有助于提升面试通过率,增加面试信心。resolve();})}, 0);resolve();})async1();

2401_83384536的博客 2089

第67步 时间序列建模实战:ARIMA建模(Stata)

第67步 时间序列建模实战:ARIMA建模(Stata)

Jet4505的博客 6822

WRFDA如何读取风云四号A 星的GIIRS数据?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1030

前端面试题 | 你对JS Event Loop 事件循环机制怎么理解?

JS是一门单线程的语言,它的异步和多线程操作是通过Event Loop事件循环机制来实现的。 Event Loop 大体由三部分组成:调用栈(call stack),消息队列(Message Queue),微任务队列(Microtask task) Event Loop开始时,会从全局栈开始执行,遇到函数调用,会把它压入调用栈中,被压入的函数叫做帧(Frame),当函数返回后,会从调用栈中弹出 ...

weixin_48491416的博客 935

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

面试必备JavaScript事件循环机制(event loop)

用简单的流程解释事件循环。在了解什么是事件循环之前我们需要先行了解javascript是一个单线程语言和javascript的事件分类javascript是一个单线程语言什么是单线程。举个例子:这就好像食堂打饭,如果食堂开设多个窗口,那么就可以有多个同学同时打饭。但如果食堂只有一个窗口,那么所有的同学都要在这一个窗口后面一个个排队打饭。单线程,就属于后者这个情况。同理,javascript中...

web全栈开发的博客 429

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

前端面试系列-JavaScript中的Event Loop(事件循环)机制(含图解)

前端面试系列-JavaScript中的Event Loop(事件循环)机制, javascript是一门单线程的非阻塞的脚本语言。 浏览器环境下js引擎的事件循环机制 执行栈与事件队列 执行上下文 执行栈 栈溢出 事件队列(Task Queue) 事件循环(Event Loop) 微任务(micro task)和宏任务(macro task) node环境下的事件循环机制 1.与浏览器环境的差异 2.事件循环模型 3.事件循环各阶段详解

LYFlied的博客 2771

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

事件循环之宏任务和微任务

一、什么是事件循环 因为JS单线程的特点,所以提出了任务队列的概念。主线程从"任务队列"中读取事件,这个过程是循环不断的。这个过程会不断重复。所以被称为Event Loop.事件循环的概念很常见,比如在vue源码中nextTick中就有涉及到这个机制。 二、 为什么javascript采用单线程 与其用途有关,javascript作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。如果两个线程同时操作dom,一个线程正在操作dom节点,一个线程删除dom节点;两者就会产生冲

weixin_42991716的博客 861

一道面试题引发对javascript事件循环机制(Event Loop)的 思考(这里讨论针对浏览器)...

????????废话不多说,先上题: //请写出输出内容 async function async1() { console.log('async1 start'); await async2(); console.log('async1 end'); } async function async2() { console.log('async2'...

abc2346789的博客 279

JS学习笔记——事件循环机制Event loop(面试必问)

不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序。 Event Loop 这个概念相信大家或多或少都了解过,但是有一次被一个小伙伴问到它具体的原理的时候,感觉自己只知道个大概印象,于是计划着写一篇文章,用输出倒逼输入,让自己重新学习这个概念,同时也能帮助更多的人理解它。 1、JavaScript单线程 先简单介绍几个相关概念: 进程: cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)。比如你正在运

MRlaochen的博客 1113

js 面试题--事件循环event loop--宏任务和微任务

js 面试题--事件循环event loop--宏任务和微任务

m0_65730686的博客 937

前端面试必考题:JavaScript事件循环(Event loop)、宏任务微任务

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、事件循环二、宏任务/微任务无渲染有渲染 一、事件循环 我们都知道,Js引擎是单线程的,也就是说每次执行一堆程序,必须是一个执行完再去执行另一个。那可能有人要问了:平时我们开启setTimeout定时器,也没见影响到后面程序的运行啊!是因为javascript从诞生之日起就是一门单线程的非阻塞的脚本语言。而它的非阻塞性是通过异步任务来实现的,可见setTimeout就是一个异步任务。 那么从上图我们就可以得知:实现异步任务,就

weixin_60297362的博客 1941

面试率 90% 的JS事件循环Event Loop,看这篇就够了,2024年最新高级程序员面试题 架构

我们再来分析下 promise.then(微任务)的处理。当执行到 promise.then 时,V8 引擎不会将异步任务交给浏览器其他线程,而是将回调存在自己的一个队列中,待当前执行栈执行完成后,立马去执行 promise.then 存放的队列,promise.then 微任务没有多线程参与,甚至从某些角度说,微任务都不能完全算是异步,它只是将书写时的代码修改了执行顺序而已。setTimeout 有“定时等待”这个任务,需要定时器线程执行;

m0_57473261的博客 1157

前端面试必考题:JavaScript事件循环(Event loop)、宏任务微任务(3)

面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。前端面试题汇总前端面试题汇总。

2401_84446787的博客 115
上一篇: 【react学习】react入门必备知识
下一篇: 【面试】BFC(块级格式化上下文)
谭CV
博客等级 码龄9年 73粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值