js 栈 html标签修复,JS中,script(整体代码)是怎么入栈的?

本文深入探讨JavaScript中的异步执行机制,重点解析宏任务(macro tasks)与微任务(micro tasks)的执行顺序。通过一个代码示例解释了setTimeout和Promise.then的执行流程,阐述了主js、setTimeout回调以及Promise.then如何按照特定顺序执行。理解这一机制对于优化JavaScript性能和避免回调地狱至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(function test() {

setTimeout(function() {console.log(4)}, 0);

new Promise(function executor(resolve) {

console.log(1);

for( var i=0 ; i<10000 ; i++ ) {

i == 9999 && resolve();

}

console.log(2);

}).then(function() {

console.log(5);

});

console.log(3);

})()

那这道题目举例吧。

为什么输出结果是1,2,3,5,4而非1,2,3,4,5?

既然你已经知道怎么分类了,不就不赘述了。直接说说macrotasks和microtasks的执行顺序吧:

主js作为macro先入队列,编号ma1

执行到setTimeout...,回调作为macro入队列,编号ma2

执行到new Promise...,then作为micro入队列,编号mi1

ma1执行完之前,调用mi1,mi1执行完以后,ma1也就正式的结束了

ma2开始执行

可以认为macro是主人,micro是奴隶,哪个macro创建了micro,micro就管它叫主人。

ma1快死之前,对奴隶mi1说,我要挂了,你一起陪葬吧,mi1说好的便上吊了,ma1看mi1死后,也就安心的去了。

然后ma2也准备要死了,,,

总的来说就是,macro作为主导,它有支配micro的能力,在一个macro任务消灭之前,它会让它创建的micro任务都执行完,然后才进入下一个macro任务。

然后,入栈出栈,这个另一个概念,是每个task执行它的代码的时候发生的,比如变量定义,函数调用,通过栈的入出,计算出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值