单元一之第五章事件循环(event-Loop)

59 阅读2分钟

问题

1.当代码碰见异步(WebAPIs)函数应该如何处理

  1. 将函数放到Call Stack判断
  2. 如果是异步函数setTimeout浏览器会选择性忘记它 => 并把他丢给任务队列
  3. 任务队列取出其中的回调函数()=>{}并将其放到消息队列(Message Queuse)
  4. 调用栈执行并检查Call Stack调用栈是否为空,如果当前函数在调用栈中并且函数没有调用完
    1. 如果为空,会将消息队列中可用的下一个项目添加到调用堆栈中 => 并执行Event Loop => 将获取消息队里的下一个项目并将其添加到调用堆栈(Call Stack)中()=>{console.log("1")}
      1. console.log("1") => 从调用栈中删除
    2. ()=>{console.log()}从调用栈中删除
  5. 当前调用栈为空(trim),并且消息队列(Message Queue)中也为空
  6. 此时 JS 在登台另一个需要执行的 JS 命令

总结

  • 实现异步 JS,事件循环(event Loop)对于实现这一点至关重要 , 虽然 js 是同步,但是它与事件循环(event Loop)和 WebAPIs 的交互允许我们可以实现异步编码
  1. JS 是单线程 => 只有一个调用栈 => 一次只能做一件事 => 同步
  2. 哪些属于浏览器的任务,JavaScript 引擎不必处理
    1. 但是被作为需要处理一部分的回调被继承会事件循环引擎中使用
      1. 所作所为 从消息队列中拉出并将它们添加到调用堆栈中
  • 一旦(消息队列)回调添加到调用堆栈,代码将由调用栈处理
  • 如果代码不是来自队列(queue) => 提醒事件循环不断检查队列中的项目 => 如果调用堆栈为空的并且队列中有东西 => 将队列中的下一个可用项目添加到调用堆栈(event loop)中