# fed-e-task-01-01 **Repository Path**: mxydl2009/fed-e-task-01-01 ## Basic Information - **Project Name**: fed-e-task-01-01 - **Description**: 拉勾教育大前端高薪训练营 002 期作业仓库,阶段一,模块一 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-23 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fed-e-task-01-01 ## 介绍 拉勾教育大前端高薪训练营 002 期作业仓库,阶段一,模块一 ## 简答题 ### 谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务 #### JS异步编程 JavaScript本身是一种单线程语言,JavaScript执行引擎对JavaScript代码的执行只在主线程进行,于是为了避免一些耗时的操作阻塞主线程,导致浏览器UI界面的卡顿迟滞,不得不采用异步编程的方式,将一个耗时的任务分解,执行一部分之后,将执行权让出给其他任务,然后再通过回调函数的方式来执行剩下的任务,从而保证一个流畅的UI界面响应。 #### EventLoop事件循环与消息队列 异步编程是通过事件循环机制来保证任务的异步执行。事件循环也是浏览器提供的一种机制,维护着一个消息队列。通过浏览器或其他运行环境提供的异步API,将回调函数放入消息队列。当主线程的执行栈为空的时候,事件循环机制会将消息队列中的任务放入执行栈中来执行。通过不断地判断主线程执行栈是否为空,从而将消息队列中的任务不断放入主线程执行栈中执行,这一过程就是事件循环机制。 #### 宏任务与微任务 宏任务和微任务是对异步任务的一种分类,目的在于确定回调函数的执行顺序。每一轮事件循环执行一个宏任务,然后将微任务的队列清空,接着浏览器去更新UI界面。 ##### 宏任务 宏任务包含很多种任务源,因此也会有很多个消息队列。宏任务的任务源包括如下: - script,脚本所包含的JavaScript代码; - 定时器,setTimeout、setInterval、setImmediate(非标准) - I/O操作,如Ajax请求、读取文件操作等 - requestAnimationFrame,在浏览器UI渲染之前执行 宏任务的执行按照消息队列中的顺序来执行。如果在宏任务A中创建了宏任务B,则会在下一轮事件循环中执行宏任务B。 ##### 微任务 微任务队列只有一个,任务源包括如下: - process.nextTick(node环境),process.nextTick的优先级要高于Promise - Promise - MutationObserver 如果在本轮事件循环中执行的微任务中又创建了微任务,则会被添加到微任务队列中,在本轮事件循环末尾清空微任务队列。