在面试中经常会被问到JS事件循环机制的问题,今天来整理一下大致的回答技巧:
Js是单线程,即任务是串行执行的,后一个任务需要等待前面一个任务执行完成之后,才会开始执行,这就可能出现长时间的等待。由于Ajax网络请求、setTimeout、DOM事件的用户交互等任务在执行的时候,是不消耗CPU的,所以会形成空等现象,大大的浪费了资源。所以出现了异步:通过将任务交给相应的异步模块去处理,大大的提升了主线程的效率。
描述:主线程读取JS代码,此时为同步环境,形成相应的堆和执行栈。当有异步任务的时候,主线程会将该异步任务提交给对应的异步进程进行处理,而CPU继续处理下一个任务。当异步任务处理完成会将该任务推入任务队列中;CPU在完成任务后,在空闲时间会在任务队列中读取异步任务的callback进行后续的操作。一直重复调取并完成任务,直到所有任务完成。
图解:
参考文档: 彻底弄懂 JavaScript 执行机制