js里的事件循环

         js是一门单线程的语言,一个时间只能做一件事。事件循环就是为了实现单线程非阻塞的方法,也可以说是用来实现异步操作。

        在js中,所有的任务可以分为同步任务和异步任务。

        同步任务是立即执行的任务,会直接在主线程中执行,也可称为主执行栈(执行级别是优先级最高的);

        异步任务会放入任务队列中执行,主线程任务执行完毕后去任务队列中读取异步任务将其推入主线程(主执行栈)执行;

        异步任务队列分为宏队列,微队列:    

  • 执行一个宏队列里的任务,如果遇到微任务就将它放到微任务的事件队列中

  • 当前宏队列任务执行完成后,会查看微队列,然后将里面的所有任务依次执行完

        如下示例

console.log('script start');

setTimeout(function() {
  console.log('setTimeout');
  Promise.resolve().then(function() {
    console.log('promise4');
  })
  Promise.resolve().then(function() {
    console.log('promise5');
  })
}, 0);

setTimeout(() => {
  console.log("setTimeout2");
}, 0);

Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});

console.log('script end');

输出

js里的事件循环_第1张图片

再复杂一点

async function async1() {
  console.log('async1 start')
  await async2()
  console.log('async1 end')
  await async4()
  await async3()
}
async function async2() {
  console.log('async2')
  return Promise.resolve().then(() => {
    console.log('async2 Promise');  
  })
}
async function async3() {
  console.log('async3')
  return Promise.resolve().then(() => {
    console.log('async3 Promise');
  })
}
async function async4() {
  console.log('async4')
  setTimeout(() => {
    console.log("async4 settimeout");
  }, 1000);
  return Promise.resolve().then(() => {
    console.log('async4 Promise');
  })
}
console.log('script start') // 1
setTimeout(function () {
  console.log('settimeout')
})
async1() 
new Promise(function (resolve) {
  console.log('promise1')
  resolve()
}).then(function () {
  console.log('promise2')
})
console.log('script end')

会输出什么?

你可能感兴趣的:(javascript,前端,开发语言)