JavaScript事件循环机制

关于事件循环

主线程从“任务队列”中读取事件,这个过程是循环不断的,所以整个的这种运行机制,又称为Event Loop (事件循环)。

关于执行栈

当一个脚本第一次执行的时候,js引擎会解析这段代码,并将其中的同步代码按照执行顺序加入执行栈中,然后从头开始执行。如果当前执行的是一个方法,那么js会向执行栈中添加这个方法的执行环境,然后进入这个执行环境继续执行其中的代码。当这个执行环境中的代码 执行完毕并返回结果后,js会退出这个执行环境并把这个执行环境销毁,回到上一个方法的执行环境。这个过程反复进行,直到执行栈中的代码全部执行完毕。

  • 当代码执行的时候,同步代码按照执行顺序开始执行
  • 当代码执行的时候,碰到函数,引擎会在栈里产生这个函数执行栈,也叫执行上下文。
  • 当代码执行到函数的时候,会进入这个执行环境继续执行其中的代码,反复进行,全部执行完
关于任务队列
  • 微任务队列(micro tasks)只会有一个
  • 宏任务队列(macro tasks)可以有多个
  • click ajax 等回调方法都会进入到宏任务队列(macro tasks)中,当然也包括上面的
  • 宏任务按顺序执行,且浏览器在每个宏任务之间渲染页面
  • 所有微任务也按顺序执行,且在以下场景会立即执行所有微任务
    • 每个回调之后且js执行栈中为空。
    • 每个宏任务结束后。
关于Nodejs事件循环机制过程

NodeJs 的运行是这样的:

  • 初始化 Event Loop
  • 执行您的主代码。这里同样,遇到异步处理,就会分配给对应的队列。直到主代码执行完毕。
  • 执行主代码中出现的所有微任务:先执行完所有nextTick(),然后在执行其它所有微任务。
  • 开始 Event Loop
  • 当每个阶段执行完毕后,都会执行所有微任务(先 nextTick,后其它),然后再进入下一个阶段。
自己的小总结
  • 宏任务->微任务->宏任务中的微任务
例题
async function b() {
    console.log('b');
    await c();
    console.log('b1');
}
async function c() {
    console.log('c');
    await new Promise(function(resolve, reject) {
        console.log('promise1');
        resolve();
    }).then(() => {
        console.log('promise1-1');
    });
    setTimeout(() => {
        console.log('settimeout1');
    });
    console.log('c1');
}
new Promise(function(resolve, reject) {
    console.log('promise2');
    resolve();
    console.log('promise2-1');
    reject();
}).then(() => {
    console.log('promise2-2');
    setTimeout(() => {
        console.log('settimeout2');
        new Promise(function(resolve, reject) {
            resolve();
        }).then(function() {
            console.log('?');
        });
    });
}).catch(() => {
    console.log('promise-reject');
});

console.log('200');
b();

运行结果:

promise2
promise2-1
200
b
c
promise1
promise2-2
promise1-1
c1
b1
settimeout2
?
settimeout1

参考文章

js 异步、栈、事件循环、任务队列
微任务、宏任务、立即执行函数(async await)
浏览器内核机制、JS事件循环、Promise、Task、事件冒泡、事件委托详解
强推该博客,可以看到整个过程是怎样执行的

基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例,该项目是个人毕设项目,答辩评审分达到98分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了Cesium的一些基础示例基于Vue 3实现的Cesium大屏可视化项目源代码,展示了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值