JS是单线程的,因此同一时间只能干一件事。
任务队列中包含同步任务和异步任务,异步任务要挂起;同步任务执行完才会去执行异步任务
Event Loop事件循环:运行栈运行的是同步任务。浏览器识别了事件是一个异步任务,就不会把它放在运行栈里,而是拿走。拿走了之后也不是立马放在异步队列中,而是当同步任务执行完以后,再放入异步队列。如果运行栈里没有任务了,就开始执行异步任务。执行完后如果运行栈里没有任务了,再监听异步队列,这个循环的过程就是EventLoop。
什么时候会开启异步任务?
- setTimeout,setInterval
- DOM事件
- ES6中的promise
setTimeout(function () { console.log('setTimeout'); },0); console.log('Hi'); //输出结果 Hi setTimeout /* *setTimeout是异步任务,会在console.log('Hi');执行之后才执行 */
关于async await promise setTimeout的执行顺序:
- promise优先于setTimeout
- promise创建后会立即执行
- await后面的函数执行完毕后才会让出线程
async function async1(){ console.log('async1 start') await async2() console.log('async1 end') } async function async2(){ console.log('async2') } console.log('script start') setTimeout(function(){ console.log('setTimeout') },0) async1(); new Promise(function(resolve){ console.log('promise1') resolve(); }).then(function(){ console.log('promise2') }) console.log('script end') //输出结果 script start async1 start async2 promise1 script end promise2 async1 end setTimeout
详细解读参考:https://segmentfault.com/a/1190000015057278?utm_source=index-hottest