# 二.代码执行

# 1.2. 浏览器模型

  • 用户界面:地址栏、前进/后退按钮、书签菜单等。

  • 浏览器引擎:在用户界面和呈现引擎之间传送指令。

  • 呈现引擎:又叫渲染引擎或叫浏览器内核,在线程方面又称为 UI 线程

  • 网络:用于网络调用,比如 HTTP 请求。

  • 用户界面后端:用于绘制基本的窗口小部件,UI 线程和 JS 共用一个线程。

  • JavaScript 解释器:用于解析和执行 JavaScript 代码

  • 数据存储:这是持久层。浏览器需要在硬盘上存储各种数据,例如 cookie

# 1.3. 除 JavaScript 线程和 UI 线程之外的其他线程

  • 浏览器事件触发线程
  • 定时触发器线程
  • 异步 HTTP 请求线程

# 1.4. 任务队列

  • 1.所有的同步任务都在主线程上执行,形成一个执行栈
  • 2.主线程之外,还存在一个任务队列。只要异步任务有了运行结果,就在任务队列中放置一个事件
  • 一旦执行栈中所有的同步任务执行完毕,系统就会读取任务队列,看看里面又那些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行
  • 主线程不断重复上面的第三部

# 1.5. Event Loop

主线程从任务队列中读取事件,这个过程是不断的,所以整个的这种运行机制又称为 Event Loop(事件循环)