js为单线程语言,js的代码ke分为同步任务和异步任务,为解决异步任务导致的阻塞等待问题,js采用了事件循环机制。
一、什么是同步任务、异步任务?
同步任务:在主线程上,排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
异步任务:不进入主线程,而进入任务队列的任务,只有‘任务队列’通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
二、什么是宏任务和微任务?
异步任务又细分为宏任务和微任务。
宏任务:ajax请求回调函数,读写文件回调函数,定时器回调函数,事件处理函数等,script中的代码块,都属于宏任务。(script(整体代码),setTimeout,setInterval,setImmediate,I/O,ui rendering)
微任务:promise对象.then的回调函数,promise.nextclick等,都属于微任务。(process.nextTick, Promise,MutationObserver)
注意:一个宏任务中的同步任务执行完后,会先看有没有相关的微任务,若有,会先执行完所有微任务,再执行下一个宏任务。
三、什么是事件循环?
1、所有同步任务都在主线程上执行,形成一个执行栈。异步任务放在宿主环境进行执行,执行完的异步任务放在任务队列中。
2、当主线程中的执行栈为空时,检查事件队列是否为空,如果为空,则继续检查,如不为空,则取出任务队列的首部,加入执行栈。
3、执行任务。
4、检查执行栈,如果执行栈为空,则继续从任务队列中读取异步任务的回调函数,放到执行栈中依次执行,这个不断循环的过程,就被称之Eventloop(事件循环)。