乐趣区

关于javascript:关于javascript运行机制

要理解 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() 会同步地期待音讯达到(如果以后没有任何音讯期待被解决)

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

退出移动版