美文网首页
【浏览器】为什么 Javascript 要是单线程的 ?

【浏览器】为什么 Javascript 要是单线程的 ?

作者: SophieRabbit | 来源:发表于2020-01-10 21:04 被阅读0次

概要:

1.js为单线程:因为多线程会导致DOM操作冲突;

2. js阻塞页面加载:GUI 渲染线程与 JavaScript 引擎为互斥的关系,以防止DOM tree渲染冲突;

3. css阻塞页面加载:GUI 渲染线程与 JavaScript 引擎为互斥的关系,以防止CSSOM tree渲染冲突

1. 为什么 Javascript 要是单线程的 ?

这是因为 Javascript 这门脚本语言诞生的使命所致!JavaScript 为处理页面中用户的交互,以及操作 DOM 树、CSS 样式树来给用户呈现一份动态而丰富的交互体验和服务器逻辑的交互处理。

如果 JavaScript 是多线程的方式来操作这些 UI DOM,则可能出现 UI 操作的冲突。

如果 Javascript 是多线程的话,在多线程的交互下,处于 UI 中的 DOM 节点就可能成为一个临界资源,

假设存在两个线程同时操作一个 DOM,一个负责修改一个负责删除,那么这个时候就需要浏览器来裁决如何生效哪个线程的执行结果。

当然我们可以通过锁来解决上面的问题。但为了避免因为引入了锁而带来更大的复杂性,Javascript 在最初就选择了单线程执行。

2. 为什么 JS 阻塞页面加载 ?

由于 JavaScript 是可操纵 DOM 的,如果在修改这些元素属性同时渲染界面(即 JavaScript 线程和 UI 线程同时运行),那么渲染线程前后获得的元素数据就可能不一致了

因此为了防止渲染出现不可预期的结果,浏览器设置GUI 渲染线程与 JavaScript 引擎为互斥的关系

当 JavaScript 引擎执行时 GUI 线程会被挂起,GUI 更新会被保存在一个队列中等到引擎线程空闲时立即被执行。

从上面我们可以推理出,由于 GUI 渲染线程与 JavaScript 执行线程是互斥的关系,当浏览器在执行 JavaScript 程序的时候,GUI 渲染线程会被保存在一个队列中,直到 JS 程序执行完成,才会接着执行。

因此如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

3. css 加载会造成阻塞吗 ?

由上面浏览器渲染流程我们可以看出 :

DOM 解析和 CSS 解析是两个并行的进程,,所以CSS 加载不会阻塞 DOM 的解析

然而,由于 Render Tree 是依赖于 DOM Tree 和 CSSOM Tree 的,

所以他必须等待到 CSSOM Tree 构建完成,也就是 CSS 资源加载完成(或者 CSS 资源加载失败)后,才能开始渲染。

因此,CSS 加载会阻塞 Dom 的渲染

由于 JavaScript 是可操纵 DOM 和 css 样式 的,如果在修改这些元素属性同时渲染界面(即 JavaScript 线程和 UI 线程同时运行),那么渲染线程前后获得的元素数据就可能不一致了。

因此为了防止渲染出现不可预期的结果,浏览器设置GUI 渲染线程与 JavaScript 引擎为互斥的关系。

因此,样式表会在后面的 js 执行前先加载执行完毕,所以css 会阻塞后面 js 的执行

作者:null仔

链接:https://juejin.im/post/5e143104e51d45414a4715f7

相关文章

  • javascript的微任务和宏任务

    为什么javascript是单线程? 因为javascript作为浏览器脚本语言一定是单线程的,如果javascr...

  • 浏览器的Event loop

    js为什么是单线程的? JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主...

  • JavaScript事件循环

    为什么js是单线程 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用...

  • 浏览器和Node中的Event Loop

    为什么javascript是单线程的?因为javascript最初设计是运行在浏览器的,首先系统分配给浏览器的内存...

  • JS的运行机制

    一、为什么JavaScript是单线程? (1) JS为什么是单线程的? JS最初被设计用在浏览器中,那么想象一下...

  • 【浏览器】为什么 Javascript 要是单线程的 ?

    概要: 1.js为单线程:因为多线程会导致DOM操作冲突; 2. js阻塞页面加载:GUI 渲染线程与 JavaS...

  • 知道html5 Web Worker标准吗?能实现JavaScr

    js为什么是单线程? 主要是因为最开始javascript是单纯的服务于浏览器的一种脚步语言(那时候没有nodej...

  • 搜狗前端面试

    1、为什么JavaScript是单线程的? 作为浏览器的脚本语言,JavaScript的主要用途是与用户互动,以及...

  • 浏览器渲染页面

    浏览器的工作机制 浏览器包含渲染引擎(也称浏览器内核)和 JavaScript 引擎,它们都是单线程运行。单线程的...

  • JavaScript中的JS引擎的执行机制

    为什么JavaScript是单线程? Javascript引擎是单线程机制,首先我们要了解Javascript语言...

网友评论

      本文标题:【浏览器】为什么 Javascript 要是单线程的 ?

      本文链接:https://www.haomeiwen.com/subject/vrvmactx.html