JS是一种单线程语言,意味着它一次只能执行一个任务,然而JS经常需要处理异步任务,比如网络请求、定时器等,而这些任务不能阻塞主线程。这时候就需要EventLoop 来协调异步任务的执行
同步任务:一个任务的完成依赖于另一个任务时,只有等待被依赖任务完成后,依赖的任务才能算完成。结果是 要么都成功,要么都失败。
异步任务:不需要等待被依赖任务的完成,只是通知被依赖任务需要完成什么工作,依赖的任务立即执行。
Event Loop的基本工作原理
1.执行栈(call stack):执行栈是一个存储函数调用的栈结构。当一个函数被调用后,它就会被推入执行栈,执行完毕后就会被弹出。这是一个同步执行的过程。
2.消息队列(Message Queue):消息队列用来存放异步任务的回调函数。当异步任务完成后,会将其回调函数放入消息队列中。
3. 事件循环(Event Loop):Event Loop是一个持续运行的循环,负责检查执行栈和消息队列。当执行栈为空时,Event Loop会检查消息队列是否有待执行的任务,如果有,就将任务的回调函数推入执行栈执行。这一过程一直循环,形成了事件循环。
4.宏任务(Maro Task)和微任务(Micro Task):在事件循环中,任务分为宏任务和微任务。宏任务包括整体的Script 代码、setTimeout、setInterval等,而微任务包括Promise、Process、nextTick等,微任务的优先级高于宏任务,会在当前宏任务执行完毕后立即执行。