# fed-e-task-01-01 **Repository Path**: sfljskeprim_admin/fed-e-task-01-01 ## Basic Information - **Project Name**: fed-e-task-01-01 - **Description**: No description available - **Primary Language**: NodeJS - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-07-19 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fed-e-task-01-01 简答题1:谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的?什么是宏任务?什么是微任务? 1. JS异步编程的理解:JavaScrip设计一开始就是采用单线程的模式。采用单线程模式工作的原因,需要进行DOM操作,如果多个线程同时修改DOM浏览器无法知道以哪个线程为主。而单线程的工作模式其实就是:**排队执行** 也就是下一段代码要等待上一段代码执行完毕才能执行,但是在编写JavaScript程序时常常会遇到通过网络请求数据等待响应、固定的时间间隔重复执行动画等,如果还是使用单线程来执行那么页面就会卡顿用户无法操作等现象,所以出现了JavaScript的异步编程,当我们进行某些耗时操作时不会影响主线程UI的操作,事实上程序中现在运行的部分和将来运行的部分之间的关系就是异步编程的核心。 2. EventLoop、消息队列都是做什么的? 当JavaScript在执行同步任务的过程中,如果遇到异步任务不会先执行异步任务放到Web API中,当同步任务执行完毕,会把异步任务 放到消息队列(queue)中,然后事件循环通过消息队列拿到事件,去执行事件。 我觉得事件循环和消息队列可以通过如下的伪代码来了解这个概念会更加清晰: ``` var queue = [];//消息队列 var event; //永远执行 while(true){ //一次tick if (queue.length > 0) { //拿到队列中的下一个事件 event = queue.shift(); //执行事件 try { event(); } catch (e) { reportError(err); } } } ``` 3. 什么是宏任务?什么是微任务 **宏任务**: 浏览器为了能够使得JS内部task与DOM任务能够有序的执行,会在一个task执行结束后,在下一个 task 执行开始前,对页面进行重新渲染 (task->渲染->task->...) 鼠标点击会触发一个事件回调,需要执行一个宏任务,然后解析HTMl.比如常见的setTimeout的作用是等待给定的时间后为它的回调产生一个新的宏任务。 **微任务**: 微任务通常来说就是需要在当前 task 执行结束后立即执行的任务,比如对一系列动作做出反馈,或或者是需要异步的执行任务而又不需要分配一个新的 task,这样便可以减小一点性能的开销。只要执行栈中没有其他的js代码正在执行且每个宏任务执行完,微任务队列会立即执行。如果在微任务执行期间微任务队列加入了新的微任务,会将新的微任务加入队列尾部,之后也会被执行 注意几点: - js的运行环境就是在宏观任务中执行的,而宏观任务可以嵌套宏观任务或微观任务,都必须等当前的宏观任务执行完毕后,才能执行嵌套的宏观任务或者微观任务. - 微观任务比宏观任务先执行,如果相同的任务则在前面的任务先执行. - 在当前的微任务没有执行完成时,是不会执行下一个宏任务的。