JavaScript是否使用d性跑道算法进行处理

JavaScript是否使用d性跑道算法进行处理,第1张

JavaScript是否使用d性跑道算法进行处理

Flash的“d性跑道”是从浏览器继承的。当然,在浏览器范围内,我们不会这样称呼-我们将其称为事件循环。

javascript事件循环的历史始于在Netscape上进行渐进式GIF和JPEG渲染。渐进式渲染(部分加载内容的绘图)是Netscape实施异步下载渲染引擎所必需的。当Brendan
Eich实现javascript时,该异步事件循环已经存在。因此,向其添加另一层是一项相当简单的任务。

因此,浏览器的事件循环如下所示:

    Event loop        ┌──────────┐        │          │        │          │        │          ▼        │        check if there's any new ───────▶ parse data        │        data on the network         │        │          │   │        │          ▼   │        │        check if we need to execute  ◀─────────┘        │        any javascript ──────────────────▶ execute        │          │         javascript        │          ▼ │        │        check if we need to ◀────────────────┘        │        redraw the page  ──────────────▶ redraw page        │          │  │        │          │  │        └────◀─────┴─────────────────◀─────────────────┘

其余的,正如他们所说,是历史。当Microsoft复制javascript时,他们不得不复制事件循环以保持与Netscape的兼容性。因此,形式上每个人都必须做同样的事情以保持与Netscape和IE的兼容性。

请注意,Javascript没有任何功能可以手动递归到事件循环中(某些语言,例如tcl,可以做到),因此浏览器必须等到没有其他javascript执行后才能重画页面。在脚本结束之前不能强制进行页面重绘。

因此,当您尝试在创建后立即读取它们时,诸如元素的宽度或高度之类的计算值有时会返回错误的值-
浏览器尚未绘制它们。如果您确实需要在页面重绘后执行代码,则解决方法是

setTimeout
使用超时值为0的a来允许浏览器运行事件循环的一轮。


其他细节:

似乎有一种例外情况会触发昂贵的回流。请注意,重排是浏览器计算页面布局。如果浏览器需要绘制更改的页面,通常会触发该事件。

当页面中的某些内容发生更改时,将对重排计算进行排队-
不会立即执行。如以上说明中所述,重排将仅在javascript执行结束时执行。但是有一种情况会导致浏览器立即执行重排计算:如果您尝试读取任何计算出的值,例如宽度和高度。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5623137.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存