js是一门单线程的编程语言,也就是说js在处理任务的时候,所有任务只能在一个线程上排队被执行,那如果某一个任务耗时比较长呢?总不能等到它执行结束再去执行下一个。
所以在线程之内,又被分为了两个队列:
同步任务队列
异步任务队列
这里说的异步任务队列是包含了独立于主执行栈之外的宏任务和微任务两个队列。其中宏任务包括:定时器、ajax请求、dom事件;微任务包括:Promise.then、MutationObserver(html5新特性)。
如何理解JS事件循环机制:
事件循环是JS处理异步函数的方法,其中涉及到JS执行栈、宿主环境的其他线程(浏览器的其他线程web API)、事件队列。首先执行执行栈中的代码,遇到异步任务时将代码交给浏览器的其他线程处理,当执行栈中的所有代码全部执行完毕时,在从事件队列中取出第一个任务放入执行栈。然后重复循环。当执行栈清空时,JS引擎首先将微任务中的所有任务依次执行结束后,再执行宏任务。
下面给出一个栗子具体分析:
打印结果:C E D A B
1.首先setTimeout A加入到宏任务队列中
2.当执行obj.func()时setTimeout B加入到宏任务队列中
3.返回的Promise函数中首次打印C,执行resolve()时回调then方法中的函数,D放入微队列首位
4.继续执行,控制台第二次打印E
5.按照任务队列的执行顺序依次打印D、A、B
参考文章:https://www.qdskill.com/javascript/8429.html