一、当使用浏览器打开网页时
1.为了避免相互影响,为了减少连环崩溃的几率,当启动浏览器后,它会自动启动多个进程(其中包括浏览器进程、网络进程、渲染进程)、每一个进程里面都包含很多的线程
2.
3.浏览器负责执行HTML、CSS、JS代码的是在渲染进程里面的渲染主线程里面进行的
一、为什么会有事件循环?
渲染主线程的任务十分繁忙、需要它处理的任务有很多例如:(解析 HTML、解析 CSS、计算样式....)
所以因为渲染主线程任务非常多就遇到了一个问题如何去调度执行任务比如:
1.渲染主线程正在执行一个 JS 函数,执行到一半的时候用户点击了按钮,我该立即去执行点击事件的处理函数吗?
2.渲染主线程正在执行一个 JS 函数,执行到一半的时候某个计时器到达了时间,我该立即去执行它的回调吗?
......
所以浏览器想出来了一个解决办法:让其他线程把这一个个事情包装成任务放入到消息队列末尾让渲染主线程每一次循环会检查消息队列中是否有任务存在。如果有,就取出第一个任务执行,执行完一个后进入下一次循环;如果没有,则进入休眠状态
一、总结:
事件循环又被叫做消息循环,是浏览器渲染主线程的工作方式,当浏览器渲染主线程每次都会从消息队列当中取出第一个任务开始执行,其他线程会把一个个事情包装的任务放在消息队列的末尾供渲染主线程进行调度 以前的浏览器把队列分为了宏队列和微队列,现在浏览器换了一种更加灵活的处理方式。W3C官方的说明是 每个任务都会有不同的类型,同类型的任务需要放在一个队列当中,不同任务队列有不同的优先级,在每一次事件循环中,有浏览器决定该取哪一个队列当中的任务,但是浏览器必须要有一个微队列,微队列中的任务优先于别的队列里面的任务