1. EventLoop又叫事件循环,是单线程语言JS在运行代码时不被阻塞的一种运行机制。
2. JS代码的执行分为同步代码和异步代码。
当碰到同步代码时直接在执行栈中执行,当碰到异步代码并且时机符合时,就会把对应异步代码添加到任务队列中。
当执行栈中的同步代码执行完毕后,就会去任务队列中把异步代码拿到执行栈中执行。
这种反复轮训任务队列并把异步代码拿到执行栈中执行的操作,就是事件循环(EventLoop)。
Event Loop即事件循环,是解决javaScript单线程运行阻塞的一种机制,也就是我们经常使用异步的原理。
Javascript单线程任务被分为同步任务和异步任务,同步任务会在调用栈中按照顺序等待主线程依次执行,异步任务会在异步任务有了结果后,将注册的回调函数放入任务队列中等待主线程空闲的时候(调用栈被清空),被读取到栈内等待主线程的执行。
setTimeout(() => {
// 这个回调一定是 1s 执行吗?不一定,取决于执行栈中的同步代码的执行事件有没有超过 1s console.log(3)
}, 1000)
while(true) {}
// 怎么保证那个时间就是准确的呢?
// web worker => 开启多线程 => 把耗时的操作放到另外一个线程
任务队列又分为宏任务(task) 和 微任务(microtask)
1.宏任务与微任务都是异步任务,都是在同一个任务队列中,主要区别在于它们的执行顺序。
2.在异步任务队列下 ,又分为宏任务队列与微任务队列。
事件循环流程(EventLoop流程)
- 先解析默认script宏任务,进入第一个宏任务
- 判断代码是同步还是异步
- 如果是同步,立即执行
- 如果是异步,就会放入异步队列,微任务放入微任务队列,宏任务就放入宏任务队列
- 当前队列所有的同步都执行完毕之后,开始执行异步
- 先执行微任务,再执行宏任务.完成本次事件循环
怎么判断哪些是宏任务?哪些是微任务
(1) 宏任务
script(整体代码)
setTimeout
setInterval
http回调
I/O
UI交互事件(事件回调)
postMessage
MessageChannel
setImmediate(Node.js 环境)
(2)微任务
Promise.then
Object.observe
MutationObserver
process.nextTick(Node.js 环境)