以下是来自jQuery源代码(bit.ly/jqsource)的一段代码:
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch(e) {
setTimeout( doScrollCheck, 1 );
return;
}
// and execute any waiting functions
jQuery.ready();
}
检测DOM何时为IE准备就绪是一种攻击。虽然理论上这看起来非常漂亮,但我有点担心setTimeout( doScrollCheck, 1 );
,这意味着在DOM准备好之前,函数doScrollCheck()
每秒被调用1000次。
我是否应该期待这是一次巨大的性能消耗?
答案 0 :(得分:3)
setTimeout
函数几乎永远不会在请求的时间调用。浏览器可以在几毫秒的时间内自由地执行+/-,如果还有其他任何密集的工作,那么它可以延迟秒或更多。正如其他人已经提到的,浏览器还实现了最小的超时时间。这1毫秒简单地告诉浏览器“你做完你正在做的任何事情后,请告诉我,让我知道所以我可以做点什么”。它还可以从Javascript中执行,以便浏览器可以返回执行下一步操作。
答案 1 :(得分:0)
我认为不是 - 在DOM准备好之前,用户无论如何都无法迭代页面,并且一旦准备好DOM就会停止每1ms检查。
另外,这个doScrollCheck函数与setInterval(doScrollCheck,1)不同。 后者不等待doScrollCheck实际完成,它只会尽可能快地触发它的doScrollCheck函数 - 这可能是性能问题,因为可能有几十个重叠调用同一个函数。
我不确定我是否已经通过检查某事(在这种情况下是documentElement上的属性)以更长/更短的间隔检测到DOM已准备就绪。
答案 2 :(得分:0)
最小超时间隔远大于1毫秒。如果你的代码在那里进行了大量的DOM操作,那么即使暂停被迫更长时间,你也会开始加热CPU。
一些新的浏览器(Firefox和Chrome,也许是Safari)可以为未关注的标签页和窗口提高最大超时时间。
对于现代CPU来说,即使是毫秒也是很长一段时间。