异步:
异步 async 是相对于同步 async 而言的,同步就是一件事一件事的执行。只有前一个任务执行完毕,才能执行后一个任务。
同步任务:
指的是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
异步任务:
指的是不进入主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
- 同步和异步任务在不同的执行"场所",同步的进入主线程,异步的进入Event Table执行并注册函数。
js中使用:
当JS解析执行时,会被引擎分为两类任务,同步任务(synchronous) 和 异步任务(asynchronous)。
对于同步任务来说,会被推到执行栈按顺序去执行这些任务。
对于异步任务来说,当其可以被执行时,会被放到一个 任务队列 里等待JS引擎去执行。
当执行栈中的所有同步任务完成后,JS引擎才会去任务队列里查看是否有任务存在,并将任务放到执行栈中去执行,执行完了又会去任务队列里查看是否有已经可以执行的任务。这种循环检查的机制,就叫做事件循环。
JavaScript 执行机制:
主线程任务——>微任务——>宏任务
如果宏任务里还有微任就继续执行宏任务里的微任务,如果宏任务中的微任务中还有宏任务就在依次进行
宏任务和微任务
1.两者都是异步
2.进程的切换肯定是宏任务,因为需要花费大量的资源
3.线程的切换是微任务,因为只需要在同一个进程中切换就可以了
4.更准确的说,很多微任务都是纤程的切换导致的,纤程是比线程更小的概念
5.为什么和定时器有关的任务是宏任务?
因为计时是实时的,它一定不能被阻塞,所以定时器被设计在另一个进程中被管理,所以,定时器任务会有进程的切换,所以只能是宏任务
6.事件为什么是宏任务呢?
事件的触发是依赖于浏览器的实现,平台有它自己的事件注册和派发机制,比如nodeJS用的内核libuv,所以不管怎样,事件的独立注册表和派发机制导致,他也不会和JS存在一个进程中,事件的管理中心一定是在另外一个进程中实现的,那么去派发事件,也就是宏任务