1. js是单线程,在同一时间只能做一件事情。
    2. 任务队列:同步队列和异步队列两种
    3. 同步任务(依次执行)和异步任务(先挂起,同步任务完毕处理异步任务)
    4. 异步任务的放入时间和执行时间
    5. 事件循环event loop
      1. 执行栈执行的是同步任务,并在这一过程中放入微任务和宏任务
      2. 同步任务执行完之后,检查微任务并放入主线程任务栈中执行
      3. 取出宏任务队列中的任务,放入执行栈中执行,开始下一轮的事件循环
    6. 异步任务触发
    • setTimeout和setInterval
    • DOM事件:用addeventlistener注册一个事件,浏览器会有一个单独的模块去接收,事件触发的时候,浏览器的模块就开始把注册的函数体放到异步队列中
    • ES6中的promise
    1. await和事件循环的关系
    • 遇到await关键字,await右边的语句会被立即执行然后await下面的代码进入等待状态,等待await得到结果。
    • await后面如果不是 promise 对象, await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的东西,作为 await表达式的结果。
    • await后面如果是 promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为 await 表达式的运算结果。