JS 脚本执行之所以会阻塞页面渲染,核心原因在于浏览器渲染进程中的GUI 渲染线程和 JS 引擎线程是互斥的(Mutually Exclusive)。 简单来说,浏览器为了保证页面内容的一致性,不允许一边画页面(渲染),一边改页面(JS 执行)。 以下是详细的深度解析: 1. 根本原因:线程互斥与“主线程” 在浏览器的每个渲染进程(Tab 页)中,有一个主线程(Main Thread)。这个主线程非常繁忙,它既要负责解析 HTML、计算样式、布局(Layout)、绘制(Paint),又要负责执行 JavaScript 代码。 GUI 渲染线程:负责构建 DOM 树、CSSOM 树、渲染树以及绘制页面。 JS 引擎线程:负责解析和执行 JavaScript 脚本。 这两个线程是互斥的。这意味着当 JS 引擎执行时,GUI 线程会被挂起(冻结),GUI 更新会被保存在一个队列中,等到 JS 引擎空闲时立即执行。反之亦然。 2. 为什么要设计成互斥?(为了数据一致性) 这是为了防止竞态条件(Race Condition)。 JavaScript 的主要作用之一就是操作 DOM(文档对象...