JavaScript的执行是单线程的。
JavaScript的任务分为同步任务和异步任务,同步任务放入执行栈,异步任务放入任务队列。
- 先执行
执行栈(call stack)
中的同步任务 - 遇到异步任务放入
任务队列(event queue)
中 - 执行栈中的任务执行完毕,系统依次读取任务队列中的异步任务,放入执行栈开始执行,执行后清除(出栈)
任务队列又分为两种,微任务的执行先于宏任务:
宏任务队列
:计时器结束的回调、事件回调、http回调等等大部分异步任务函数;
微任务队列
:Promise产生的回调(then)、mutationObserver
由于主线程不断重复获得任务 -- 执行 -- 获得 -- 执行,这种机制成为事件循环(event loop)
。
异步进程的处理:
决定何时/是否将异步任务写入任务队列。
如:click事件,点击时才写入;定时器,时间到了才写入。