http://www.ruanyifeng.com/blog/2014/10/event-loop.html

基本概念

因为JavaScript语言的特点就是单线程,就是说同一时间只能做一件事, eventloop 就是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。

为什么 JavaScript 是单线程?

不想让浏览器变得复杂(避免复杂性),因为多线程需要共享资源、且可能修改彼此运行的结果。

进程 && 线程

  • 进程是操作系统分配资源的最小单位,线程是程序执行的最小单位。
  • 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
  • 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号)。
  • 调度和切换:线程上下文切换比进程上下文切换要快得多

    任务队列

    所有的任务都被分成了同步任务和异步任务
    同步任务:进入主线程(执行栈),在主线程的任务只有前一个任务完成才能执行下一个任务
    异步任务:是进入任务队列的任务,只有”任务队列”通知主线程,某个异步任务可以执行了才进入主线程执行
    image.png

事件和回调函数

当某一项异步任务完成(例如请求完成),就在”任务队列”中添加一个事件,表示相关的异步任务可以进入主线程了,主线程读取”任务队列”有哪些事件要执行,然后执行这些事件的回调函数。

“任务队列”是一个先进先出的数据结构,排在前面的事件优先被执行,只要执行栈已清空,就会自动的去读取,但是由于存在定时器的存在,主线程会先检查一下执行时间

Event Loop

死记规则!!!

  • 先执行同步代码再执行异步代码
  • 先执行微任务再执行宏任务

宏任务和微任务

宏任务是由宿主发起的,而微任务由JavaScript自身发起。

image.png