js单线程,事件循环,微任务宏任务

js为什么是单线程

单线程:同一个时间只能做一件事

Js作为浏览器脚本语言,它的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定Js同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?之后为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。

JavaScript为什么需要异步

如果JS中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验。

单线程如何实现异步
通过事件循环(Event loop)来实现的。
具体过程:例如:setTimeout(callback,time);典型的异步函数,这个函数包括3部分:

            发起函数:setTimeout()

            回调函数:calllback

            定时时间:time

js执行顺序为

页面上先声明的js=>页面上后声明的js=>外部引用的js

微任务和宏任务

宏任务macrotask: 可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。主要场景有:主代码块、setTimeout、setInterval等
微任务microtask: 在当前task执行结束后立即执行的任务。主要场景有:Promise、process.nextTick等。

例:
setTimeout(function(){
	console.log('1');
});
new Promise(function(resolve){		    
	console.log('2');
	resolve();
}).then(function(){		    
	console.log('3');
}); 		
console.log('4');

遇到setTimout,异步宏任务,放入宏任务队列中;
遇到new Promise,new Promise在实例化的过程中所执行的代码都是同步进行的,所以输出2;
而Promise.then中注册的回调才是异步执行的,将其放入微任务队列中
遇到同步任务console.log(‘4’);输出4;主线程中同步任务执行完
从微任务队列中取出任务到主线程中,输出3,微任务队列为空
从宏任务队列中取出任务到主线程中,输出1,宏任务队列为空

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力奔波的程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值