要理解js运行机制,须要从浏览器说

浏览器是多过程的

每关上一个Tab页,就相当于创立了一个独立的浏览器过程

浏览器都蕴含哪些过程?

1.Browser过程:浏览器的主过程,只有一个(协调、主控)
2.插件过程
3.GPU过程
4.浏览器渲染过程(浏览器内核,页面渲染,脚本执行,事件处理等)

重点
咱们前端开发次要关注 渲染过程(例如webkit)

渲染过程是多线程的

GUI渲染线程
负责解析HTML,CSS ,构建DOM树和RenderObject树,布局,绘制
JS引擎线程(例如v8)
JS引擎线程负责解析Javascript

✔GUI渲染线程与JS引擎线程是互斥的
(因为这个特点,若js执行事件太长,就会造成页面渲染不顺畅,造成页面渲染阻塞,显示器60hz刷新,16ms每帧.16ms内要运行实现js和渲染实现)

事件触发线程
1.这个线程不是webkit的,它是属于浏览器平台,它是事件循环
eventloop的重要外围
2.如果事件合乎触发条件,这个线程会把此对应工作退出事件队列(例如:鼠标点击,AJAX申请)
定时触发器线程
1.setInterval与setTimeout所在线程
2.这2个计时器不是js引擎操作的
3.计时结束,增加到事件队列中
http申请线程
1.在XMLHttpRequest在连贯后是通过浏览器新开一个线程申请
2.XMLHttpRequest对象上的回调函数,在状态变动时候,被放入事件队列

从EventLoop说到JS的运行机制

1.javascript是单线程
2.javascript的运行分为同步工作异步工作
3.同步工作在js的主线程执行
3.事件触发线程 治理着 工作队列

异步工作有了后果,事件触发线程就在工作队列中放一个事件,主线程同步工作执行结束后才去执行工作队列

宏工作和微工作

1.宏工作是每次执行栈执行的代码就是一个宏工作(包含每次从事件队列中获取一个事件回调并放到执行栈中执行)

2.微工作是在以后同步工作执行完结后立刻执行的工作

宏工作是定时触发器线程,http申请线程造的,宏工作是事件触发线程保护的.
微工作是S引擎线程操作的,微工作队列执行实现,才会去执行宏工作

上面这段来着MDN

之所以称之为 事件循环,是因为它常常依照相似如下的形式来被实现:

while (queue.waitForMessage()) {  queue.processNextMessage();}

queue.waitForMessage() 会同步地期待音讯达到(如果以后没有任何音讯期待被解决)

疯狂循环运行,期待音讯,去运行
这就是浏览器背地的事,搞不懂了