每次面试基本上都会被面试官问到这个问题,不知道从何说起.今天小编就梳理一下这个事件循环机制
首先众所周知js是单线程的,因为我们js诞生时就是为了解决浏览器交互问题.如果是多线程,同时操作dom,一个删除一个新增命令就不知道该听哪个命令.这样也复杂.与我们js诞生初衷违背了. 那js是单线程,并且它的执行是自上而下.如果前一个任务一直在执行,就会阻塞后一个任务执行.为了解决这个问题,我们js又新出了一个异步.我们现在的异步有两种,一种是宏任务,例如一次性定时器setTimeOut.定时器setInterval,Ajax/fetch,一种是微任务,例如promise里的then,catch等. 到这里我们就解释了js事件循环的大概前提. 那js循环机制到底是怎么样的呢 首先我们js任务分为同步任务和异步任务 同步任务-立即放入js引擎(js主线程)执行,并原地等待结果 异步任务-先放入宿主环境(浏览器/node),不必原地等待结果,并不阻塞主线程继续往下执行,异步结果在将来执行. 遇到同步代码,放入执行栈中立即执行 遇到异步代码交给宿主环境.时间一到就把任务放到任务队列.执行栈执行完了就会去看任务队列有没有待执行的任务.如果有就放入执行栈执行. 查看任务队列有没有任务,然后拿到执行栈里执行,再查看任务队列,再执行.这一整个就是事件循环