浏览器中是否有用于滚动的特殊线程?

时间:2019-01-31 16:49:00

标签: javascript blocking dom-events

我正在为我的一个类编写一个JavaScript教程,我想说明一下调用堆栈可以阻止其他进程,并且在这种情况下,页面交互将排队,直到调用堆栈为空。

const print = function(){
	console.log( "Hello World" );
}
setTimeout(print,0);
for(let i=0 ; i < 2000000000 ; i++);
console.log();

运行上面的代码后,我让他们单击链接并调整窗口大小,以查看该页面没有重新呈现,但是滚动在许多网站上都可以正常工作,例如Stack Overflow。它在Reddit上被阻止。我已经在Chrome和Firefox上对此进行了测试,以仔细检查是否进行了一些优化,但是其行为类似。

我假设一个站点是否没有与滚动相关的事件的事件处理程序,所以有一个用于基本滚动的特殊线程。这是因为我注意到带有粘性标头的网站可以滚动,但直到循环结束后才具有粘性效果。

1 个答案:

答案 0 :(得分:4)

我在下面链接到Nolan Lawson的Microsoft博客文章中,有很多关于这个确切问题的好信息-请阅读。这是该博客文章的摘录:

  

事实证明,整个“浏览器都是单线程的”故事在很大程度上是正确的,但也有一些重要的例外。滚动具有各种风格,是其中的一种例外。

     

多年来,浏览器供应商已经认识到将工作卸载到后台线程可以极大地改善平滑度和响应速度。滚动对于每个浏览器的核心用户体验都至关重要,因此很快被认为是进行此类优化的成熟目标。如今,每个主要的浏览器引擎(Blink,EdgeHTML,Gecko,WebKit)都支持将主线程外滚动到一个或另一个角度(Firefox是该俱乐部的最新成员,而Firefox 46则是这样)。

来源Scrolling on the web: A primer