# fed-e-task-01-01 **Repository Path**: zuojinsheng/fed-e-task-01-01 ## Basic Information - **Project Name**: fed-e-task-01-01 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-03 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fed-e-task-01-01 ### JavaScript异步编程 1、JS是单线程模式,也就是说JS代码在执行的时候是从上往下依次执行 优点:实现起来比较简单,执行环境相对单纯 缺点:只要有一个任务耗时很长,后面的任务就必须排队对待执行,会拖延整个程序的执行 时间 2、为了解决这个问题,JS讲任务执行模式分为两种,同步和异步 3、同步:JS执行引擎会把我们整体的代码加载进来,会在我们的调用栈当中压入一个匿名的调用,然后会逐个执行我们的代码,当执行一个任务的时候,它会将我们的任务压入到调用栈当中执行,执行完成然后弹栈,继续执行下一个任务 4、异步:首先跟同步一样,JS执行引擎先把我们的代码加载进来,在调用栈当中压入一个匿名调用逐个执行我们的代码,当遇到异步调用的时候先压栈,然后将异步任务放到内部API当中, 然后继续执行下一个任务,当调用栈当中没有任务的时候,EventLoop暂停执行。当内部API当中任务执行完成之后,会将任务放到消息队列当中,当消息队列发生变化的时候,EventLoop会将消息队列当中的第一个任务放到调用栈当中执行,执行完成之后弹栈,继续执行消息队列当中的第一个任务 ### EventLoop EventLoop主要是监听调用栈和消息队列,当调用栈中没有任务的时候,EventLoop就会在消息队列当中取出第一个人任务压入到调用栈当中,执行任务,直至消息队列和调用栈当中都没有任务的时候,EventLoop停止 ### 消息队列 主线程在执行任务的过程中如果遇到异步任务,就会将异步任务放到内部API当中。等到异步任务满足条件之后,就会将异步任务放到消息队列当中,如果主线程当中没有任务的时候,EventLoop将会监听消息队列将第一个任务放到主线程当中执行 ### 宏任务/微任务 宏任务和微任务表示异步任务的两种分类 1、宏任务:当前调用栈中执行的代码称为宏任务(script、setTimeOut、setInterval、I/O、UI render) 2、微任务:当内部API挂起异步任务是,JS引擎会将任务按照宏任务和微任务进行分类。首先会执行第一个宏任务,当地一个宏任务执行完毕之后会去执行微任务当中所有的任务,当所有的微任务全部执行完毕之后,开启下一轮循环,执行下一个宏任务(Promise、Object.observe、MutationObserver)