12Js面试题-异步和单线程

122 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、异步

(一)什么是异步

  • 下图中的代码依次打印100、300、200(异步的情况)
  1. 执行第一行,打印100
  2. 执行setTimeout后,传入setTimeout的函数会被暂存起来,不会立即执行(单线程的特点)
  3. 执行最后一行,打印300
  4. 等所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行
  5. 发现暂存的setTimeout中的函数无需等待时间,就立即过来执行

image.png

  • 下图中的代码依次打印100,弹出200,打印300(同步的情况)

image.png

(二)何时需要异步

  • 在可能发生等待的情况需要异步
  • 等待过程中不能像alert一样阻塞程序运行
  • 因此,所有的“等待的情况”都需要异步

(三)前端使用异步的场景

  • 定时任务:setTimeout,setInverval
  • 网络请求:ajax请求,动态 < img >加载
  • 事件绑定

二、面试题

(一)同步和异步的区别

  • 同步会阻塞代码,二异步不会
  • alert是同步,setTimeout是异步

(二)关于setTimeout的笔试题

  • 会依次打印1,3,5,2,4
  1. 执行第一个console.log(),打印1
  2. 执行第一个setTimeout后,传入setTimeout的函数被暂存起来
  3. 执行第二个console.log(),打印3
  4. 执行第二个setTimeout后,传入setTimeout的函数被暂存起来
  5. 执行第三个console.log(),打印5
  6. 此时所有程序执行完,处于空闲状态,会立马看有没有暂存起来的要执行
  7. 发现暂存的第一个setTimeout中的函数无需等待时间,就立即过来执行,打印2
  8. 发现暂存的第二个setTimeout中的函数需等待1s,等待结束后打印4

image.png

(三)前端使用异步的场景

  • 具体见上文