用1毫秒重复setTimeout()

时间:2011-08-24 13:03:51

标签: jquery

以下是来自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次。

我是否应该期待这是一次巨大的性能消耗?

3 个答案:

答案 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来说,即使是毫秒也是很长一段时间。