从面试题谈event loop

【前端面试题】事件循环event_loop JavaScript是一个单线程语言。 任务分为同步任务和异步任务。 同步任务就是立即执行的任务,同步任务会进入主线程立即执行,当浏览器遇到异步任务时,会将异步任务扔到异步队列中去,等同步任务执行完毕后,再按照“微先宏后”的执行顺序依次执行异步任务。 “微先宏后”就是在异步任务队列中微任务先执行,宏任务后执行。 微任务包括:promise 宏任务包括:setTimeout、setInterval、UI交互、IO、script整体代码 下面来看面试题,先看题目,思考后有自己的想法再看题目结果,有不 阅读详情

// 代码一开始就执行宏任务-宏0

    console.log('script start')

    setTimeout(() => {

      console.log('北歌')

    }, 1 * 2000)

    Promise.resolve()

      .then(function () { // 微1-1

        console.log('promise1')

      })

      .then(function () { // 微1-4 这个then中的会等待上一个then执行完成之后得到其状态才会向Queue注册状态对应的回调,假设上一个then中主动抛错且没有捕获,那就注册的是这个then中的第二个回调了。

        console.log('promise2')

      })

    async function foo () {

      await bar()

      console.log('async1 end') // 微1-2

    }

    foo()

    async function errorFunc () {

      try {

        await Promise.reject('error!!!111')

      } catch (e) {

        // => 从这后面开始所有的代码可以理解为放到异步队列微任务中

        console.log(e) // 微1-3

      }

      console.log('async1')

      return Promise.resolve('async1 success')

    }

    errorFunc().then(res => console.log(res))

    function bar () {

      console.log('async2 end')

    }

    console.log('script end')

    // 第一次执行:

    // 全局一个宏任务执行, 输出同步代码。挂载宏1、微1-1、微1-2、微1-3、微1-4。1-表示属于第一次轮询

    // run: script start、 async2 end、script end

 

    // 第二次执行:

    // 同步代码执行完毕,开始执行异步任务中的微任务对列中的代码

    // 微任务列表:只有一个队列且会在当前轮询一次清空

    // run:

    // 执行微1-1: promise1

    // 执行微1-2: async1 end

    // 执行微1-3: error!!!、async1 。当前异步回调执行完毕才Promise.resolve('async1 success'),然后注册then()中的成功的回调-微1-5

    // 执行微1-4: promise2

    //     执行刚刚注册的微1-5: async1 success

 

    // 第三次执行

    // 开启第二波轮询:执行宏1

    // run: '北歌'

【高频考点精讲】彻底搞懂Event Loop:从调用栈到微任务,JavaScript运行机制可视化解析 Event Loop是JavaScript异步编程的核心机制。同步代码 > 微任务 > 渲染 > 宏任务微任务队列会在当前宏任务结束后立即清空每个宏任务都会重新开始一个Event Loop循环下期我们会深入探讨async/await是如何基于Promise和Generator实现的,敬请期待! 阅读详情

相关推荐

js代码-浏览器的event loop面试题

js代码-浏览器的event loop面试题

面试题:事件循环(Event Loop)

在日常工作中,你有没有碰到过这种疑惑: 疑惑一:为什么这份代码它不按照我的意思走?为啥不是输出 1 2 3? for (var i = 0; i < 3; i++) { setTimeout(() => { console.log(i); // 3 3 3 }, 1000); } 疑惑二:为什么这份代码它也不按照我的意思走?为啥不是输出 jsliang? let name; setTimeout(() => { name = '梁峻荣'; console

明天也要努力的博客 5693

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1604

事件循环(Event Loop)相关概念 及 面试题

小伙伴们,看面试题前,先来看几个概念吧!!! 宏任务 (macro)task,可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。 任务(代码) 宏任务 环境 script 宏任务 浏览器 事件 宏任务 浏览器 网络请求(Ajax) 宏任务 浏览器 setTimeout() 定时器 宏任务 浏览器 / Node fs.readFile() 读取文件 宏任务 N

m0_67841039的博客 1186

CS231n+assignment2(一)

cs231n作业二详解+代码

qq_56551150的博客 2411

基于TL431与光耦的电压反馈环路优化设计实战

本文深入探讨了基于TL431与光耦的电压反馈环路优化设计实战。文章从理解这对“黄金搭档”的工作原理入手,详细拆解了电压采样电阻网络、偏置电路、光耦工作点设置以及动态补偿网络的设计心法与计算步骤。重点分享了如何通过RC补偿网络调试,确保环路在各种负载下稳定可靠,并提供了关键的实战避坑指南,帮助工程师解决电源设计中常见的振荡、噪声及可靠性问题。

nginx7reverse的博客 777

event loop 面试题

题目一 async function async1() { console.log('async1 start'); await async2(); console.log('async1 end'); } async function async2() { new Promise(function (resolve) { console.log('promise1'); resolve(); }).then(function () {

weixin_49115895的博客 826

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 374

从手写 Promise 到 Event Loop:前端异步面试题全解读

JS异步编程是面试中的"送命题",涉及事件循环、任务队列等核心概念。文章从手写Promise入手,解析状态流转、异步调度和回调存储机制,并讲解EventLoop执行顺序(宏/微任务区别)和async/await的底层实现。通过典型代码示例演示执行顺序,对比Node.js与浏览器环境差异,指出process.nextTick在Node中的优先执行特点。最后强调系统化理解异步机制的重要性,提供学习交流渠道。全文精炼解析JS异步编程的关键知识点。

Anthony1453的博客 1968

快速理解OSI七层模型(举例理解,数据传输过程,深入理解OSI七层模型)

我们需要了解互联网的本质是一系列的网络协议,这个协议就叫做OSI协议(开放系统互联(Open System Interconnection)),它是由ISO(国际标准化组织)定义的。 需要注意,随着时代的发展,OSI已经被TCP/IP 4层模型淘汰,在当今世界上并没有大规模的使用。 那么对于OSI,人们按照功能不同,分工不同,人为的将OSI的分为七层。实际上这七层是并不存在的,也就是说没有这些概念,而我们今天提到的七层概念,只是人为的划分而已。目的只是为了让大家更好地理解这些都是用来做什么的。

CN_TangZheng的博客 3万+

cmu15445(2024fall) project 2

project 2比p1难度要更大,代码量更大且涉及的知识更多,实现中出现的bug更多,好在是最后全部解决了。我最大的收获在于对于多线程编程的理解更深入了,实际发现解决了多个多线程相关的bug,学会了更多多线程下debug的技巧方法,也见识了更多多线程的bug情况。在之后可以更系统的学习一下多线程编程。同时学会实现B+树也是需要掌握的基础。

Jerome_Yi的博客 1559

前端面试大全:Event Loop

(内容同步自小邹的头条号:沪漂程序员的生活史) 在前两篇文章中小邹介绍了 JS 异步相关的知识。在实践的过程中,你是否遇到过以下场景,为什么 setTimeout 会比 Promise 后执行,明明代码写在 Promise 之前。这其实涉及到了 Event Loop 相关的知识,这一篇文章我们会来详细地了解 Event Loop 相关知识,这也是面试经常会问的一个问题。   进程与线程 ...

itKingOne的博客 4406

Clock Gating设计陷阱:为什么你的ICG cell总是导致setup violation?(附解决方案)

本文深入分析了数字IC设计中ICG(Integrated Clock Gating)单元导致setup时序违规的常见问题,包括时钟偏斜和数据路径过长两大核心原因。通过量化分析影响因素,提供了逻辑重组、寄存器重定时等优化策略,并介绍了预防性设计方法和物理实现阶段的优化技巧,帮助工程师有效解决ICG相关的setup violation问题。

weixin_29168153的博客 205

JavaScript之彻底学会Event Loop

关于JavaScriptEvent Loop。同步与异步执行顺序JavaScript将任务分为同步任务和异步任务,同步任务进入主线中中,异步任务首先到进行回调函数注册。当异步任务的,将回调函数从压入中。主线程里面的同步任务执行完毕,系统会去中读取异步的回调函数。只要主线程空了,就会去读取回调函数,这个过程被称为Event Loop。执行的流程如下:下面一起来看一个例子,熟悉一下上述流程。// 下面代码的打印结果?// 同步任务 打印 first。

2401_86022696的博客 872

AM243x多核MCU启动流程解析与OSPI Flash烧录实战

嵌入式系统开发中,引导加载器是芯片上电后执行的第一段软件,负责初始化硬件、加载操作系统或应用程序。其工作原理通常遵循多级引导链,从ROM固件到用户可定制的二级引导程序,逐级建立完整的软件运行环境。这一机制的技术价值在于实现可靠的系统启动、支持安全校验,并为多核异构架构提供协同基础。在应用场景上,引导加载器广泛应用于工业控制、汽车电子和物联网设备,确保设备能从非易失性存储器中自主启动。本文聚焦于TI AM243x这类高性能多核MCU,深入剖析其包含RBL和SBL在内的三级启动流程,并详细演示如何通过UART接

weixin_28703451的博客 582

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

event loop

javascript event loop事件 1、event loop是什么? Event Loop 是 JavaScript 异步编程的核心思想。 我们注意到,在异步代码完成后仍有可能要在一旁等待,因为此时程序可能在做其他的事情,等到程序空闲下来才有时间去看哪些异步已经完成了。所以 JavaScript 有一套机制去处理同步和异步操作,那就是事件循环 (Event Loop)。 用文字描述的话,大致是这样的: 所有同步任务都在主线程上执行,形成一个执行栈 (Execution Context Stac

qq_52769681的博客 260

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

通杀 Event Loop 面试题03-JS单线程, event loop彻底搞懂代码执行顺序 浏览器工作原理

单线程的含义 浏览器是 multi-process,一个浏览器只有一个 Browser Process,负责管理 Tabs、协调其他 process 和 Renderer process 存至 memory 内的 Bitmap 绘制到页面上的(pixel);在 Chrome中,一个 Tab 对应一个 Renderer Process,Renderer process 是 multi-thre...

weixin_42600182的博客 691

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

从Promise链理解Event-Loop

macrotask(宏任务):script(整体代码), XHR回调、事件回调(鼠标键盘事件)setTimeout, setInterval, setImmediate(node独有), I/O, UI rendering microtask(微任务):process.nextTick(node独有), Promises.then, Object.observe(废弃), MutationObserver ...

brokenkay的博客 379

由浅入深,一次彻底搞懂 JavaScript 执行机制 (Event Loop)

JavaScript执行顺序遵循严格的Event Loop机制,核心规则是:同步代码优先执行,微任务(如Promise.then)紧随其后,最后处理宏任务(如setTimeout)。通过银行柜台比喻,解释了单线程下同步/异步任务的处理逻辑,并强调微任务拥有更高优先级。文章通过4道由浅入深的面试题(含嵌套任务和链式调用)演示执行顺序,例如:script start -> script end -> promise1 -> promise2 -> setTimeout。掌握这些规

weixin_43334866的博客 728

理解js的事件循环Event Loop

前端业务或者面试中经常会碰见js的执行先后顺序,里面的坑很多,这时候就是在考察你有没有理解事件循环了 那么什么是事件循环Event Loop呢? 因为js是单进程的,所以有了异步,同步异步出现后就有了事件执行的先后顺序 简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。 异步分为宏任务和微任务 宏任务:整体的Script setTimeout setInterval

范天缘的博客 2万+

JavaScript 事件循环(Event Loop)

什么是事件循环? 事件循环是JavaScript实现异步编程的核心机制。JavaScript是单线程语言,通过事件循环来处理异步操作,避免阻塞主线程。

Amouzy的博客 1149

【JS】1034- Event Loop :你知道它们的打印顺序吗?

前言在 《浏览器知识点整理(十三)不同的回调执行时机:宏任务和微任务》[1] 这篇文章的后面有几道打印面试题,觉得不够过瘾,于是又找了一些对应的面试题来,还在不同的 Node.js 版本上...

pingan8787 338

【html】 Event Loop详解

我们就以一道面试题开始说起 async function a1 () { console.log('a1 start'); //2 await a2(); console.log('a1 end');//9 } async function a2 () { console.log('a2');//3 } console.log('script start')...

长歌的博客 789

Event Loop :你知道它们的打印顺序吗?

点击上方前端瓶子君,关注公众号回复算法,加入前端编程面试算法每日一题群前言在 《浏览器知识点整理(十三)不同的回调执行时机:宏任务和微任务》[1] 这篇文章的后面有几道打印面试题,觉得不...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 368

event loop php,一次弄懂event loop

Event Loop 是 JavaScript 异步编程的核心思想,也是前端进阶必须跨越的一关。同时,它又是面试的必考点,特别是在 Promise 出现之后,各种各样的面试题层出不穷,花样百出。这篇文章从现实生活中的例子入手,让你彻底理解 Event Loop 的原理和机制,并能游刃有余的解决此类面试题。先来一道面试题镇楼async function async1() {console.log('...

weixin_33736279的博客 462

Event Loop(事件循环)

先执行所有同步代码(当前宏任务)。当前宏任务结束后,立即清空所有微任务队列(包括微任务中新产生的微任务)。浏览器有机会进行页面渲染。开始执行下一个宏任务(如setTimeout回调)。重复以上流程。同步代码↓微任务(Promise.then、queueMicrotask、await 后续代码等)↓页面渲染(浏览器)↓宏任务(setTimeout、setInterval 等)

weixin_39834961的博客 219
上一篇: 如何用自定义事件进行vue组件通讯
下一篇: 如何拍平一个深层次的数组
unbreakablec
博客等级 码龄9年 10粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值