深入javascript计划七:深入浅出Event loop

从D3 00到FF FF:手把手解析RTCM3.2协议帧结构(附Python解析代码) 本文深入解析RTCM3.2协议帧结构,从同步头标识到CRC校验算法,详细讲解如何通过Python代码实现二进制数据解析。文章包含完整的RTCM3.2解析器实现,涵盖消息类型解码、CRC校验等关键步骤,并附赠特定消息类型(如1005型基准站坐标)的解析示例,帮助开发者快速掌握GNSS差分数据传输协议的核心技术。 阅读详情

为什么javascript是单线程?

因为最初javascript就是为了和浏览器交互而诞生的,如果 JS 是门多线程的语言话,我们在多个线程中处理 DOM 就可能会发生问题(一个线程中新加节点,另一个线程中删除节点),当然可以引入读写锁解决这个问题,为了避免复杂性,设计者还是把它设计成单线程模式。

后来,HTML5提出Web Worker标准, 允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM,所以这个新标准并没有改变JavaScript单线程本质。

Event Loop(浏览器、node)

什么是Event Loop?

一句话总结:Event Loop就是javascript运行机制。

为什么要有Event Loop?

因为Javascript设计之初就是一门单线程语言,因此为了实现主线程的不阻塞,Event Loop这样的方案应运而生。

任务队列

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。

如果排队是因为计算量大,CPU忙不过来,倒也算了。

但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。

JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。

同步任务指的是:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。

异步任务指的是:不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。

(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。

(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

(4)主线程不断重复上面的第三步。

只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。

任务队列分类

不同的任务源会被分配到不同的任务队列(task queue)中。

任务源可以分为 微任务(microtask-在 ES6 规范中,microtask 称为 jobs) 和 宏任务(macrotask-在 ES6 规范中,macrotask 称为 task)。

浏览器的Event loop

微任务:promise、MutationObserver

宏任务:script、setTimeout、setInterval、requestAnimationFrame、I/O

Event loop 执行顺序:

  1. 执行同步代码(script标签里面的代码---main script),这属于宏任务
  2. 执行栈为空,查询是否有微任务需要执行
  3. 执行所有微任务
  4. 必要的话渲染 UI
  5. 然后开始下一轮 Event loop,执行宏任务,然后到第二步

总结:宏任务->微任务->宏任务->微任务(这样循环)直至执行栈为空

通过上述的 Event loop 顺序可知,如果宏任务中的异步代码有大量的计算并且需要操作 DOM 的话,为了更快的 界面响应,我们可以把操作 DOM 放入微任务中。

好了,我们看例子:

console.log('执行 script start')

setTimeout(function() {
  console.log('执行 setTimeout')
}, 0)

new Promise(resolve => {
  console.log('执行 Promise')
  resolve("执行 promise resolve")
}).then(function(res) {
    console.log(res)
})

for(let i=0; i<10000; i++) {
    console.log(i)
}

console.log('执行 script end')

// 执行 script start
// 执行 Promise
// 0
// 1
// ...
// 9999
// 执行 script end
// 执行 promise resolve
// 执行 setTimeout

就不用讲解了,自行补充,如果有兴趣可以留言。

讲讲setTimeout

setTimeout() :在指定的毫秒数后调用函数或计算表达式。

HTML5标准规定了setTimeout()的第二个参数的最小值(最短间隔),不得低于4毫秒,如果低于这个值,就会自动增加。

在此之前,老版本的浏览器都将最短间隔设为10毫秒。

另外,对于那些DOM的变动(尤其是涉及页面重新渲染的部分),通常不会立即执行,而是每16毫秒执行一次。

这时使用requestAnimationFrame()的效果要好于setTimeout()。

需要注意的是,setTimeout()只是将事件插入了"任务队列",必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码耗时很长,有可能要等很久,所以并没有办法保证,回调函数一定会在setTimeout()指定的时间执行(看上面例子就知道了)。

讲讲setInterval

setInterval() :指定某个任务每隔一段时间就执行一次,也就是无限次的定时执行,直到 clearInterval() 被调用或窗口被关闭。

HTML5标准规定了setInterval()的第二个参数的最小值(最短间隔),不得低于10毫秒,如果低于这个值,就会自动增加。

setInterval()将事件插入"任务队列",跟settimeout一样。

讲讲requestAnimationFrame

requestAnimationFrame 比起 setTimeout、setInterval的优势主要有两点:

1、requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流(重排)中就完成,并且重绘或回流(重排)的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。

2、在隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的的cpu,gpu和内存使用量。

如果你有循环定时器的需求,其实完全可以通过来requestAnimationFrame实现:

function setInterval(callback, interval) {
    let timer
    const now = Date.now
    let startTime = now()
    let endTime = startTime
    const loop = () => {
      timer = window.requestAnimationFrame(loop)
      endTime = now()
      if (endTime - startTime >= interval) {
        startTime = endTime = now()
        callback(timer)
      }
    }
    timer = window.requestAnimationFrame(loop)
    return timer
}
  
let a = 0
setInterval(timer => {
    console.log(1)
    a++
    if (a === 3) cancelAnimationFrame(timer)
}, 1000)

屏幕刷新频率:屏幕刷新率是指显示器的屏幕每秒钟会刷新多少次。

目前,大部分的显示器的刷新频率为60次/秒,也就是说,屏幕刷新的间隔时间为大约1000/60=16.67ms。

所以,一般来说,如果动画的执行频率跟屏幕的刷新频率一致,动画看起来就可以达到流畅的极限

首先 requestAnimationFrame 自带函数节流功能,基本可以保证在 16.6 毫秒内只执行一次(不掉帧的情况下),并且该函数的延时效果是精确的,没有其他定时器时间不准的问题,当然你也可以通过该函数来实现 setTimeout。

node的Event loop

我们都知道Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,也就是能够让js在服务端运行。

但是Node中的Event Loop是用libuv模拟的,它将不同的任务分配给不同的线程,形成一个Event Loop,以异步的方式将任务的执行结果返回给V8引擎。

微任务:promise、process.nextTick、setImmediate

宏任务:script、setTimeout、setInterval、I/O

Node 中的 Event loop 和浏览器中的不相同,Node 的 Event Loop 分为 6 个阶段,它们会按照顺序反复运行。每当进入某一个阶段的时候,都会从对应的回调队列中取出函数去执行。当队列为空或者执行的回调函数数量到达系统设定的阈值,就会进入下一阶段。

timers

imers 阶段会执行 setTimeout()和 setInterval()回调,并且是由 poll 阶段控制的。

一个 timer 指定的时间并不是准确时间,而是在达到这个时间后尽快执行回调,可能会因为系统正在执行别的事务而延迟。

下限的时间有一个范围:[1, 2147483647] ,如果设定的时间不在这个范围,将被设置为 1。

I/O

I/O 阶段会执行除了 close 事件,定时器和 setImmediate 的回调。

idle, prepare

idle, prepare 阶段内部实现。

poll

poll 阶段很重要,这一阶段中,系统会做两件事情:

  1. 执行到点的定时器
  2. 执行 poll 队列中的事件

并且当 poll 中没有定时器的情况下,会发现以下两件事情:

  • 如果 poll 队列不为空,会遍历回调队列并同步执行,直到队列为空或者系统限制
  • 如果 poll 队列为空,会有两件事发生
    • 如果有 setImmediate 需要执行,poll 阶段会停止并且进入到 check 阶段执行 setImmediate
    • 如果没有 setImmediate 需要执行,会等待回调被加入到队列中并立即执行回调

如果有别的定时器需要被执行,会回到 timer 阶段执行回调。

check

check阶段执行setImmediat()的回调。

close callbacks

close callbacks 阶段执行 close 事件

例如:

console.log("---script----")
setTimeout(() => {
    console.log('timeout1')
    Promise.resolve().then(() => {
        console.log('promise1')
    })
    Promise.resolve().then(() => {
        console.log('promise2')
    })
}, 0)

setTimeout(() => {
    console.log('timeout2')
    Promise.resolve().then(() => {
        console.log('promise3')
    })
}, 0)

Promise.resolve().then(() => {
    console.log('script- promise')
})

process.nextTick(() => {
    console.log('script- nextTick')
})

for (let i=0; i< 100; i++) {
    console.log(i)
}

console.log("---end script----")
// ---script----
// 0
// 1
// ....
// 99
// ---end script----
// script- nextTick
// script- promise
// timeout1
// promise1
// promise2
// timeout2
// promise3

讲解:

先执行script里面的代码,执行console.log("---script----"),

把第一个定时器setTimeout扔进宏任务,

把第二个定时器扔进宏任务,

把script里的Promise扔进微任务,

把script里的process扔进微任务,

执行到forconsole.log(i)

for结束,执行console.log("---end srcipt----")

检查微任务,发现process,执行console.log('script- nextTick')

检查微任务,发现Promise,执行console.log('script- promise')

微任务执行完,开始检查宏任务,发现第一个定时器

执行console.log('timeout2'),把第一个Promise扔进微任务,把第二个Promise扔进微任务

宏任务执行完,这时候检查微任务,发现有两个,依次console.log('promise1'),console.log('promise2')

现在在检查宏任务发现第二个定时器,执行console.log('timeout2'),发现Promise把它扔进微任务,

当前宏任务执行完,检查微任务,执行Promise,console.log('promise3')

个别例子:

并且在 Node 中,有些情况下的定时器执行顺序是随机的

setTimeout(() => {
    console.log('setTimeout')
}, 0)
setImmediate(() => {
    console.log('setImmediate')
})

讲解:

 可能输出 setTimeout、setImmediate

可能也会相反的输出,这取决于性能

因为可能进入 event loop 用了不到 1 毫秒,这时候会执行 setImmediate

否则会执行 setTimeout

 当然在这种情况下,执行顺序是相同的

var fs = require('fs')

fs.readFile(__filename, () => {
  setTimeout(() => {
    console.log('timeout')
  }, 0)
  setImmediate(() => {
    console.log('immediate')
  })
})

讲解:

因为 readFile 的回调在 poll 中执行

发现有 setImmediate ,所以会立即跳到 check 阶段执行回调

再去 timer 阶段执行 setTimeout

所以以上输出一定是 setImmediate,setTimeout

上面介绍的都是 宏任务(macrotask )的执行情况,微任务(microtask )会在以上每个阶段完成后立即执行。

setTimeout(() => {
  console.log('timer1')

  Promise.resolve().then(function() {
    console.log('promise1')
  })
}, 0)

setTimeout(() => {
  console.log('timer2')

  Promise.resolve().then(function() {
    console.log('promise2')
  })
}, 0)

讲解:

以上代码在浏览器和 node 中打印情况是不同的

浏览器中一定打印 timer1, promise1, timer2, promise2

node 中可能打印 timer1, timer2, promise1, promise2

也可能打印 timer1, promise1, timer2, promise2

Node 中的 process.nextTick 会先于其他 微任务(microtask )执行。

setTimeout(() => {
  console.log('timer1')

  Promise.resolve().then(function() {
    console.log('promise1')
  })
}, 0)

process.nextTick(() => {
  console.log('nextTick')
})
// nextTick, timer1, promise1

参考:

https://juejin.im/post/59e85eebf265da430d571f89

https://yuchengkai.cn/docs/frontend/browser.html#close-callbacks

http://47.98.159.95/my_blog/js-v8/006.html#_1-%E4%B8%89%E5%A4%A7%E5%85%B3%E9%94%AE%E9%98%B6%E6%AE%B5

http://www.ruanyifeng.com/blog/2014/10/event-loop.html

https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

https://juejin.im/post/5b63b4cb6fb9a04fb4017f5a

森林冰火人html源码,森林冰火人单人版(源码) 【实例简介】java小游戏——森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败。【实例截图】【核心代码】森林冰火人单人版├── bin│ ├── game│ │ ├── Help.class│ │ ├── Logon.class│ │ ├── Main.class│ │ ├── Mykey.class│ │ ... 阅读详情

相关推荐

图形学常见概念小结

前言:本文记录《unity shader入门精要》和openGL相关学习过程中一些学习要点; 文章目录PBR流程渲染管线细分着色器的底层实现,应用原理常见的色调映射算法openGl和Direct X的区别PBR流程和URP渲染管线Camera loop(剔除)MVP矩阵变换光线追踪前向渲染和延迟渲染shader和材质的区别bloom原理后处理的理解高斯模糊实现原理图像处理中的边缘检测算子 PBR流程 小结:一套基于自然界微平面理论、能量守恒、菲涅尔反射、线性空间等的科学理论所实现的基于物理的渲染系统,包含一

小谁的博客 1163

一文了解 requestAnimationFrame

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

发果叁 1万+

遥感新手别纠结!实测ENVI 5.3、5.6、6.0三个免费版,教你混搭安装避坑

本文为遥感新手提供ENVI 5.3、5.6、6.0三个免费版的实测对比与混搭安装指南,帮助用户构建零成本高效工作流。详细解析各版本功能差异、共存安装技巧及常见问题解决方案,特别适合课程作业、毕业论文分析和遥感入门练习。

weixin_30819085的博客 472

浏览器中的 Event Loop问题

涉及面试题:异步代码执行顺序?解释一下什么是 Event Loop ? 众所周知 JS 是门非阻塞单线程语言,因为在最初 JS 就是为了和浏览器交互而诞生的。如果 JS 是门多线程的语言话,我们在多个线程中处理 DOM 就可能会发生问题(一个线程中新加节点,另一个线程中删除节点) JS 在执行的过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。如果遇到异步的代码,会被挂起并加入到 Task(有多种 task) 队列中。一旦执行栈为空,Event Loop 就会从 Task 队列中拿出需要.

LuckXinXin的博客 223

Oracle EBS R12 AP模块发票导入接口实战:从SQL插入到API调用的完整流程

本文详细解析了Oracle EBS R12 AP模块发票导入接口的完整流程,从SQL插入到API调用的实战技巧。涵盖接口表设计、数据验证、双通道导入机制及错误诊断,特别分享官方文档未提及的高阶优化方案,助力企业实现财务数字化转型。

weixin_33728268的博客 476

基于 YOLO + SAM 的自动图像标注实战

摘要: 本文提出一种基于YOLO检测和SAM分割的自动化数据标注流水线方案,通过YOLO定位目标并生成检测框,再以检测框为提示驱动SAM完成精细分割,最终输出YOLO格式的标注文件。该方案将人工标注升级为半自动流程,显著提升标注效率,尤其适用于多类别、大规模图像的实例级标注需求。代码模块化设计支持模型灵活替换,并集成异常处理与进度可视化功能。虽依赖YOLO检测质量且对小目标存在局限,但作为工程落地方案,可有效降低私有数据集构建成本,适用于工业检测、遥感等场景的冷启动标注。

qq_64366203的博客 1144

Android之控制同步处理输入(Input)、动画(Animation)、绘制(Draw)三个UI操作的Choreographer源码分析

Android系统从4.1(API 16)开始加入Choreographer这个类来控制同步处理输入(Input)、动画(Animation)、绘制(Draw)三个UI操作。其实UI显示的时候每一帧要完成的事情只有这三种。如下图是官网的相关说明: Choreographer Choreographer接收显示系统的时间脉冲(垂直同步信号-VSync信号),在下一个frame渲染

不落航班 3427

ROS 之 使用yocs_velocity_smoother对机器人速度进行限制

yocs_velocity_smoother是一个速度、加速度限制器,用来防止robot navigation的速度/转速过快,加速度/快减速过大。Bound incoming velocity messages according to robot velocity and acceleration limits. The velocity smoother nodelet runs together with the kobuki_node to apply robot’s velocity and .

https://shixuebin.gitee.io/hexo-blog/ 2622

关于requestAnimationFrame的研究笔记

首先该函数的回调只会在重排重绘之前调用,这是毋庸置的。 另外,在60fps的屏幕上,浏览器的渲染最多做到60fps,也就是说requestAnimationFrame最多只能做到16.7ms间隔执行一次,再短就不行了。究竟是为什么?当Js执行完任务,就会返回UI渲染,但是浏览器可能定义的就是在60fps的屏幕,上一次渲染和下一次渲染之间的间隔超过16.7ms,否则即使返回到了UI渲染,由于间隔没有超过16.7ms,所以就终止渲染,返回到执行Js任务了。 但是却不能保证其16.7ms能够执行一次。而且,第

lengye7的博客 1291

第076篇:大涡模拟进阶

大涡模拟(Large Eddy Simulation, LES)是介于直接数值模拟(DNS)和雷诺平均方法(RANS)之间的重要湍流模拟方法。本文深入介绍动态Smagorinsky模型、尺度相似模型、WALE模型和隐式LES等高级亚格子模型。通过Python实现槽道湍流和圆柱绕流的LES求解器,详细展示近壁面处理、动态系数计算和亚格子应力建模技术。大涡模拟,亚格子模型,动态模型,Smagorinsky,WALE模型,尺度相似模型,近壁面处理,槽道湍流LES的核心思想是对Navier-Stokes方程进行空间

2401_87715305的博客 736

24. SAP UI5 应用如何使用 OData 数据模型

本教程之前的二十三个步骤,使用的数据模型都是 JSON 模型。从本步骤开始,我们要学习另一种非常重要的数据模型:OData 数据模型。 OData 数据模型也是 SAP 产品里广泛使用的数据模型,比如 SAP S/4HANA,SAP CRM Fiori 应用等等,都使用的是 OData 数据模型而不是 JSON 数据模型。 使用 OData 数据模型的典型场景就是,通过 OData 模型提供的 Read API,将远端服务器上存储的数据通过 OData 协议读取到客户端,并显示在 SAP UI5 应用里。.

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5797

深入javascript计划六:深入浅出异步

回调函数(Callback) 回调函数应该是大家经常使用到的,以下代码就是一个回调函数的例子: ajax(url, () => { // 处理逻辑 }) 但是回调函数有一个致命的弱点,就是容易写出回调地狱(Callback hell)。假设多个请求存在依赖性,你可能就会写出如下代码: ajax(url, () => { // 处理逻辑 ajax(url1, () => { // 处理逻辑 ajax(url2, () =&g

echo_Ae的博客 402

Claude Code 100个真实案例 - 用AI设计Arduino PCB电路板(硬件小白也能画板)

本案例展示如何使用 Claude Code 配合 KiCad 的 Python 脚本接口,从零设计一块 Arduino 传感器扩展板 PCB。从原理图符号创建、网表生成到 PCB 布局布线,全程自动化完成,最终输出可直接发给工厂打样的 Gerber 文件。

yueyeguzhuo的专栏 438

深入剖析JavaScript中的Event Loop机制:异步编程的基石

本文深入解析JavaScript的Event Loop机制,阐述其如何协调单线程环境下的异步任务处理。Event Loop通过调用栈、宏任务队列(如setTimeout)和微任务队列(如Promise.then)的协同工作,确保异步任务有序执行而不阻塞主线程。文章结合实际代码示例,说明定时器、Promise和异步API的执行顺序,并指出过多微任务或不当定时器使用可能导致的性能问题,提出优化建议。理解Event Loop对编写高效异步代码至关重要,能显著提升Web应用性能与用户体验。

你若盛开,清风自来 1973

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

event-loop-explorer:深入理解JavaScript事件循环

event-loop-explorer:深入理解JavaScript事件循环 项目介绍 在现代Web开发中,JavaScript的事件循环机制对于构建高性能的应用至关重要。然而,由于其内部的复杂性,理解和掌握事件循环并不容易。event-loop-explorer 是一个开源工具,旨在帮助开发者更直观地理解JavaScript代码在浏览器中的执行过程。它通过可视化调用栈(Call Stack)、W...

gitblog_00397的博客 636

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Event Loop 教你高效 “划水”:JS 单线程的“摸鱼”指南

前言各位前端打工人,有没有过这种经历:明明写了,结果同步代码还没跑完,摸鱼计划就被打断?其实JS 单线程就像一个只能专注干一件事的打工人,而 Event Loop就是它的 “高效摸鱼手册”—— 既能按时完成核心工作,又能把耗时任务 “挂起摸鱼”,今天咱们就一起好好聊聊这份手册!一、先搞懂:JS 打工人为啥不能 “硬卷”?(进程线程的底层逻辑)要想,得先知道——JS 能修改 DOM(比如把按钮改成红色),要是它俩同时干活,页面就会出现(比如按钮画到一半被改成红色),所以必须 “你歇我干”。

2401_86373285的博客 869

jre9下载 jdk9

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

JS睡眠函数(JS sleep()函数、JS单线程、Event Loop事件循环)假睡眠

方法是否阻塞可读性推荐程度setTimeout否一般⭐⭐Promise +await否高⭐⭐⭐⭐whilebusy loop是差❌ 禁止使用JavaScript 虽然没有原生的sleep()函数,但通过异步机制,我们依然可以实现优雅、非阻塞的“睡眠”。记住一句话:JS 的 sleep,不是“让线程睡觉”,而是“让任务等待”。

Dontla的博客 2084

JS的事件循环(Event Loop)

一、任务树。

xufang461010923的专栏 5764

基础回顾JS之Event Loop

最近计划把Node整体过一遍,无意间看到Event Loop这一概念,不管在面试中还是在工作中,这一个概念还是应用的挺广泛,打算复盘一下。 单线程 无法避开不谈的是JS是单线程语言。什么线程呢?那么平时我们常说的进程是什么呢? 进程是操作系统分配资源和调度任务的基本单位 线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 即两者是包含关...

weixin_34194702的博客 133

解析浏览器中的 Event-Loop 机制

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情 前言 Event-Loop 机制想必大家都有所耳闻,今天我就带大家来了解一下浏览器中的 Event-Loop 机制。 函数调用栈 函数调用栈是个干活的地方,它会真刀真枪地给你执行任务。 需要被执行的逻辑,它首先需要被推入函数调用栈,后续才能被执行。 宏任务(macro-task)队列 宏任...

Sun_blog 59

Event Loop: 实现异步编程的核心机制

本文详细介绍了 JavaScript 事件循环机制。事件循环作为单线程 JavaScript 实现异步编程的核心,通过调用栈和任务队列的协同工作,解决了同步代码的阻塞问题。文章解析了事件循环的运行流程:同步代码优先执行,异步任务完成后回调入队,事件循环检查调用栈为空时依次执行队列任务。特别区分了宏任务(如 setTimeout)和微任务(如 Promise.then)的执行优先级,并通过代码示例展示了执行顺序。最后对比了浏览器和 Node.js 环境下事件循环的差异,强调理解事件循环机制对编写高质量 Jav

你若盛开,清风自来 1028

解释一下Node.js中的事件循环(event loop)

解释一下Node.js中的事件循环(event loop)

商务合作欢迎私信我 4847

Event Loop 在浏览器和 Node.js 中的区别

本文对比了浏览器与Node.js事件循环机制的差异。浏览器的事件循环包含6个阶段,而Node.js虽然阶段相似但实现细节不同。关键区别在于:浏览器在每个宏任务后立即执行微任务,Node.js则在阶段间处理微任务,且process.nextTick优先级最高。此外,Node.js特有的setImmediate和process.nextTick在浏览器中需用setTimeout模拟。理解这些差异有助于编写更高效的异步代码。

你若盛开,清风自来 790

(译)The Node.js Event Loop, Timers and process.nextTick()

什么是Event loop Event Loop使Node.js可以做非阻塞 I/O操作,尽管实际上JavaScript是单线程的 -- 尽可能的通过下发操作给操作系统内核。 大部分现代内核是多线程支持的,它们可以在后台处理多个操作。当这些操作中有一个完成时,内核通知Node.js执行已经被添加到了 poll 队列中对应的回调函数。我们会在之后更多的讨论这方面的细节。 Event Loop Exp...

weixin_33849215的博客 177

彻底理解 JS Event Loop(浏览器环境)

最近罗列了一些软件开发基础知识点,计划逐一的、彻底的理解每一个知识点,并为每个知识点写一篇详细的,图文并茂的文章。这篇是关于浏览器环境下 JS 的 Event Loop 机制(如有错误,欢迎指出)。 浏览器线程 我们常说 JS 是单线程语言,但是别忘了常见的浏览器内核可都是多线程的,多个线程间会进行不断通讯,通常会有如下几个线程: GUI 渲染进程 JS 引擎线程 定时器线程 事件触发线程...

weixin_34308389的博客 110

浅析 JS 中的 EventLoop 事件循环(新手向)

序Event Loop 这个概念相信大家或多或少都了解过,但是有一次被一个小伙伴问到它具体的原理的时候,感觉自己只知道个大概印象,于是计划着写一篇文章,用输出倒逼输入,让自己重新学习这个...

xionghnly的博客 159
上一篇: 深入javascript计划六:深入浅出异步
下一篇: 深入javascript计划八:深入浅出模块化
An_s
博客等级 码龄10年 665粉丝 363原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

An_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值