js之事件循环,任务队列中的微任务和宏任务,以及同步异步。

js是一门单线程语言。

进程,线程之我的理解。

进程:系统会为其分配内存。
线程:进程执行的最小单位。
我们可以把进程比作工厂,而线程比作工人。

js是单线程语言

为何不是多线程?假设现在js是多线程,现在两个线程同时分别修改同一个dom元素,那么浏览器就不知道究竟该选择哪个线程,这时候问题就出来了。所以js是一门单线程的一门语言。

同步和异步

为什么会有同步和异步的概念。(参考大佬:https://www.cnblogs.com/Yellow-ice/p/10433423.html)。因为js是单线程的,所以每次只能同步的做一件事情。
但是当我们发请求的时候,加入需要等待5秒的话,那么按照同步的执行的话,后面的代码就会被阻塞,因此,js设计之初就考虑到这个问题,然后就引出了异步的概念。

代码执行顺序

代码执行先执行同步任务然后再执行异步任务。异步任务执行顺序又是怎样的呢这里就要引出宏任务和微任务的概念了。
代码执行顺序是先执行第一个宏任务(script代码),然后执行宏任务下的微任务,当执行完第一次所有的宏任务完成后,然后依次执行宏任务下的微任务(微任务:new promise()下的then里的回调函数)。然后再执行下一次的宏任务(setTimeout或者setTimeInterval)。
(参考大佬:https://blog.csdn.net/xiaojinguniang/article/details/88311534?utm_medium=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase)

举个例子:

···
setTimeout(function(){console.log(1)},0);
new Promise(function(resolve){
console.log(2)
for( var i=0 ; i<10000 ; i++ ){
i==9999 && resolve()
}
console.log(3)
}).then(function(){
console.log(4)
});

new Promise(function(resolve){
console.log(22)
for( var i=0 ; i<10000 ; i++ ){
i==9999 && resolve()
}
console.log(33)
}).then(function(){
console.log(44)
});
console.log(5);
//答案是:2,3,22,33,5,4,44,1···

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值