设置innerHTML是同步的,您可以对DOM进行大多数更改。但是,渲染网页是另一回事。
(请记住,DOM代表“文档对象模型”。它只是一个“模型”,代表数据。用户在屏幕上看到的是该模型外观的图片。因此,更改模型并不是立即进行的更改图片-需要一些时间才能更新。)
运行JavaScript和呈现网页实际上是分别进行的。把它简单地说,首先是所有的JavaScript代码的页面运行(从事件循环-看看这个优秀的视频更多的细节),然后后,浏览器呈现的网页进行任何更改用户看到的。这就是为什么“阻塞”这么大的原因-运行计算量大的代码会阻止浏览器越过“运行JS”步骤进入“渲染页面”步骤,从而导致页面冻结或卡死。
Chrome的管道如下所示:
如您所见,所有JavaScript都首先发生。然后对页面进行样式设置,布局,绘画和合成-“渲染”。并非所有的管道都会在每一帧执行。这取决于哪些页面元素已更改(如果有)以及如何重新呈现它们。
注意:alert()
也是同步的,并且在JavaScript步骤中执行,这就是为什么在您看到网页更改之前出现警报对话框的原因。
您现在可能会问:“等等,在管道中的“ JavaScript”步骤中究竟要运行什么?我的所有代码每秒运行60次吗?” 答案是“否”,它可以追溯到JS事件循环的工作方式。JS代码仅在堆栈中时才运行-从事件侦听器,超时等之类的东西开始。观看前面的视频(真的)。
https://developers.google.com/web/fundamentals/performance/rendering/