js异步编程简答题

本文探讨了JavaScript为何采用单线程模式,解释了同步和异步模式的区别,并详细阐述了EventLoop、消息队列、宏任务和微任务的概念。JavaScript在处理耗时操作时,通过异步编程避免阻塞,EventLoop机制确保了代码的有序执行。
摘要由CSDN通过智能技术生成

javascript为什么是单线程?如何理解js异步编程的,EventLoop,消息队列都是做什么的,什么是宏任务,什么是微任务?
1. javascript为什么是单线程?
我们要知道,js的运行环境都是以单线模式去执行的js代码。
注:
1)javascript是单线程的,浏览器并不是单线程的;
2)javascrpt调用的某些内部的api并不是单线程的,例如倒计时器,内部会有个单独的线程去负责倒数;
3)我们指定单线程是指的执行代码的单线程;
采用单线程模式工作原因:
最早javascript是运行在浏览器上的脚本语言,目的实现页面上的动态交互,而实现页面交互核心就是dom操作,这也就决定了必须使用单线程模型,否则会出现复杂的线程同步问题;这里的单线程指的是:js执行环境中负责执行代码的线程只有一个;
优点:更安全更简单
缺点:如果有耗时操作,那么后面的任务排队就会等待时间延长(耗时阻塞),出现假死的情况
为了解决这个问题,JavaScript将任务的执行模式分为了两种:
同步模式
异步模式
2.同步模式
同步模式指的是javascript代码要排队执行,和代码书写顺序一致,后面的代码要等待前一句代码执行完成才能执行,javascript代码大多数是以同步模式进行执行的
3、异步模式
异步模式编程指的是不会等待这个任务结束才开始下一个任务,对于耗时操作,都是开启之后就立即往后执行下任务,耗时任务的后续逻辑通过回调函数去定义;
4、EventLoop、消息队列
EventLoop:
负责监听读取调用栈和消息队列,一旦调用栈都结束,事件循环就会从第一个消息队列中取出第一个回调函数压入到调用栈,主线程从消息队列中读取事件,这个过程是循环不断的,EventLoop是javascript的执行机制是个循环不断的过程,这种整个运行机制称为EventLoop(事件循环)
消息队列:
消息队列是暂时存放异步任务的地方,等同步代码执行完毕以后,EventLoop会从消息队列中依次取出异步任务放到调用栈再次执行

1、js引擎线程会维护一个执行栈,同步代码依次加入到执行栈中,执行完后依次移出执行栈
2、js引擎线程如果遇到异步函数,会将异步函数交给相应的Webapi,然后去继续执行后面的任务
3、Webapi会在满足条件的时候,将异步对应的回调加入到消息队列中,等待执行
4、当执行栈为空时,js引擎会去读取消息队列中的回调函数,如果有会再次加入到执行栈中去执行
5、完成后出栈,执行栈再次为空,循环上面的操作

5、宏任务
回调队列中的任务称之为宏任务, 例如:目前绝大多数异步调用的API、SetTimeout、SetInterval
6、微任务
基于当前任务产生随着当前任务结束后立即执行的任务,所以也是异步任务,宏任务执行的过程中可以临时加上一些额外需求,这个额外需求有两种办法,一种是可以当作宏任务重新去回调队列中去排队,一种是作为当前任务的为微任务,即直接在当前任务结束过后立即执行,promise的回调就是作为微任务执行的,所以在本轮调用结束的末尾自动执行;在当前的微任务没有执行完成时,是不会执行下一个宏任务的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值