EventLoop事件循环、微任务、宏任务理解

Javascript是一门单线程非阻塞的脚本语言
  • 单线程:任何时候都只有一个主线程来处理所有的任务。
  • 非阻塞:当代码需要执行异步任务时,主线程会先挂起(pending)该任务,等异步任务返回结果后再根据一定的规则去执行相应的回调。
  • JS主要用途:是与用户互动,以及操作DOM。
进程和线程的关系

进程:程序的一次执行,占有一片独有的内存空间
线程:CPU的基本调度单位,是程序执行的一个完整流程
关系

  • 一个进程中一般至少有一个运行的线程:主线程
  • 一个进程中也可以同时运行多个线程,说明程序是多线程运行的。
  • 多个进程之间的数据是不能同时直接共享的。

宏任务(macrotask)

  • 整个script标签
  • 异步 Ajax 请求
  • setTimeout()
  • setInterval()
  • 文件操作

微任务(microtask)

  • promise.then()
  • Async/await(Promise)
  • process.nextTick
  • queueMicrotask()
  • new MutaionObserver()

执行顺序:主线程 —— 微任务队列 —— 宏任务队列

EventLoop执行过程

  1. 同步任务由 JavaScript 主线程次序执行
  2. 异步任务委托给宿主环境执行
  3. 已完成的异步任务对应的回调函数,会被加入到任务队列中等待执行
  4. JavaScript 主线程的执行栈被清空后,会读取任务队列中的回调函数,次序执行
  5. JavaScript 主线程不断重复上面的第 4 步

JavaScript 主线程从“任务队列”中读取异步任务的回调函数,放到执行栈中依次执行。这个过程是循环不断的,所以整个的这种运行机制又称为 EventLoop(事件循环)

你可能感兴趣的:(JavaScript,javascript,前端)