# fed-e-task-01-01 **Repository Path**: lorixiang/fed-e-task-01-01 ## Basic Information - **Project Name**: fed-e-task-01-01 - **Description**: Part 1 : JavaScript 深度剖析 模块一:函数式编程与 JS 异步编程、手写 Promise - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-20 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fed-e-task-01-01 Part 1 : JavaScript 深度剖析 模块一:函数式编程与 JS 异步编程、手写 Promise #### 简答题答案以及说明 **谈谈你是如何理解 JS 异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务?** #### **JS 异步编程** 要理解异步编程,首先要对单线程概念有所理解,通常是说 JS 的一个特点是单线程,是由于 JavaScript 设计之初是为操作 DOM 而存在,如果有两个线程同时操作同一个 DOM 节点,则难以界定先后顺序引起界面混乱。即 JS 的同步模式下,所有的任务都需要排队执行,然而如果有容易阻塞线程的耗时任务怎么办呢,这就需要用上 JS 异步模式了。 JS 代码只能运行在主线程,当调用运行环境提供的某些 API 时,该任务会在另一个线程中进行,比如 setTimeout (定时器触发线程)和 Ajax(http 异步线程)、事件绑定(浏览器事件线程)等,我们一般会给任务传递一个回调函数,当异步调用线程上的任务执行完毕后,将该回调放入 **消息队列** 排队,当 JS 主线程执行完本轮同步任务后,会从 消息队列 中依次取任务(回调)执行。 总而言之,当前任务是同步还是异步,要看运行环境提供的 API 是以同步或异步模式方式工作。 #### **EventLoop** 主线程运行JS代码时,会生成一个 **执行栈(调用栈)** ,通过有序的入栈和出栈处理函数的顺序和嵌套执行,而 EventLoop(事件循环机制,也是一个单独的线程)的任务就是**监听调用栈和消息队列,如果调用栈为空,则会从消息队列中取第一个事件放入调用栈中执行。** #### **消息队列** 如上面所说,消息队列实际上是**存储待执行的异步任务的回调**,等待主线程调用栈为空,通过 EventLoop 来依次取回调函数来执行。先完成的任务的回调在队列的前面。 #### **宏任务、微任务** 一般把在回调队列中的任务称之为 **宏任务**,有时候在 JS 执行过程中临时加上一些额外需求,则可以选择作为新的**宏任务进入队列中排队执行**,或者作为当前任务的**微任务,直接在当前任务结束后立即执行**。 https://developer.mozilla.org/zh-CN/docs/Web/API/HTML_DOM_API/Microtask_guide 宏任务一般有 setTimeout, setInterval, setImmediate,