宏任务包括:setTimeout setInterval Ajax DOM事件
微任务:Promise async/await
两者都是异步里面的操作
微任务比宏任务的执行时间要早
宏任务和微任务的区别
异步和单线程
异步和单线程是相辅相成的,js是一门单线程脚本语言,所以需要异步来辅助
异步和同步的区别:
异步不会阻塞程序的执行。
同步会阻塞程序的执行。
同步异步问题
首先,你要知道javascript是单线程语言。js任务需要排队顺序执行,如果一个任务耗时过长,后边一个任务也的等着,但是,假如我们需要浏览新闻,但新闻包含的超清图片加载很慢,总不能网页一直卡着直到图片完全出来,所以将任务设计成了两类:
同步任务
异步任务
当我们打开网站时,网页的渲染过程就是一大堆同步任务(页面骨架和页面元素的渲染等)和异步任务(加载图片、音乐之类)相结合的执行过程
图中过程不断重复,也就是常说的Event Loop(事件循环)。
但是,JS异步还有一个机制,就是遇到宏任务,先执行宏任务,将宏任务放入任务队列(event queue),然后再执行微任务,将微任务放入微任务队列(micro task queue),但是,这两个queue不是一个queue。当你往外拿的时候先从微任务队列里拿这个回调函数,然后再从宏任务的queue拿宏任务的回调函数
只要主线程空了,就会读取任务列队,这就是js的运行机制,也被称为 event loop(事件循环)。
宏任务和微任务的执行顺序:
1.主线程上宏任务、微任务执行顺序
执行顺序:主线程 >> 主线程上创建的微任务 >> 主线程上创建的宏任务
2.宏任务中包含微任务
执行顺序:主线程 >> 主线程上的宏任务队列1 >> 宏任务队列1中创建的微任务