http://www.ruanyifeng.com/blog/2014/10/event-loop.html
基本概念
因为JavaScript语言的特点就是单线程,就是说同一时间只能做一件事, eventloop 就是指浏览器或Node
的一种解决javaScript
单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。
为什么 JavaScript 是单线程?
不想让浏览器变得复杂(避免复杂性),因为多线程需要共享资源、且可能修改彼此运行的结果。
进程 && 线程
- 进程是操作系统分配资源的最小单位,线程是程序执行的最小单位。
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
- 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号)。
- 调度和切换:线程上下文切换比进程上下文切换要
快得多
。任务队列
所有的任务都被分成了同步任务和异步任务
同步任务:进入主线程(执行栈),在主线程的任务只有前一个任务完成才能执行下一个任务
异步任务:是进入任务队列的任务,只有”任务队列”通知主线程,某个异步任务可以执行了才进入主线程执行
事件和回调函数
当某一项异步任务完成(例如请求完成),就在”任务队列”中添加一个事件,表示相关的异步任务可以进入主线程了,主线程读取”任务队列”有哪些事件要执行,然后执行这些事件的回调函数。
“任务队列”是一个先进先出的数据结构,排在前面的事件优先被执行,只要执行栈已清空,就会自动的去读取,但是由于存在定时器的存在,主线程会先检查一下执行时间
Event Loop
死记规则!!!
- 先执行同步代码再执行异步代码
- 先执行微任务再执行宏任务
宏任务和微任务
宏任务是由宿主发起的,而微任务由JavaScript自身发起。