一、JavaScript是单线程的,意味着所有任务需要排队,一个任务执行完,才能执行下一个任务。当进行像I/O这种耗时操作任务时,下一个任务会被阻塞一直挂起。为解决这个问题,JavaScript把任务分成:同步任务和异步任务。
1、同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
2、异步任务:不进入主线程、而进入"任务队列"(task queue),只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
在所有同步任务执行完之前,任何的异步任务是不会执行的。
二、理解Event Loop
1、所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
2、主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
3、一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
4、主线程不断重复上面的第三步。
主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。
一般来说,有以下四种会放入异步任务队列:
1、setTimeout和setlnterval
2、DOM事件
3、ES6中的Promise
4、Ajax异步请求