javascript运行机制类 -- event loop

javaScript
背景

浏览器的Event loop是在THML5中定义的规范,由各个浏览器厂家去实现,而node中则由libuv库实现

1)、为什么Javascript是单线程?

javascript的单线程与它的用途有关,主要用途是与用户交互以及操作DOM,假如同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器就不知道以哪个线程为准了。

2)、任务队列

所有任务分为两种,一种是同步任务,另外一种是异步任务。同步任务是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是不进入主线程、而进入“任务队列”的任务,只有“任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
“任务队列” 是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本上是自动的,只要执行栈一清空,“任务队列 ”上第一位的事件就自动进入主线程。
具体如下:

  • 所有同步任务都在主线程上执行,形成一个执行栈
  • 主线程之外,还存在一个“任务队列”,只要异步任务有了运行结果,就在“任务队列”之中放置一个事件。
  • 一旦“执行栈”中的所有任务执行完毕,系统就会读取“任务队列”,看看里面有哪些事件,那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
  • 主线程不断重复上面的第三步。
3)、浏览器有哪些异步任务
  1. setTimout和setInterval
  2. DOM事件
  3. ES6中的Promise
  4. ajax
4)、异步任务api分类

macrotasks: setTimout,setInterval,setImmediate,I/O,UI rendering
microtasks:process.nextTick,Promises,MutationObserver

4)、macrotask 与 microtasks 有什么区别?

浏览器:在每次事件循环中,macrotask只会提取一个执行,而microtask会一直提取,直到microtasks队列清空。

5)、什么是Event Loop(事件循环)?

主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)

总结

①理解JS的单线程概念
②理解任务队列
③理解Event Loop
④理解哪些语句会放入异步任务队列
⑤理解语句放入异步任务队列的时机

推荐文章