哪个更好地执行window.setTimeout

时间:2010-03-04 01:27:52

标签: javascript settimeout

哪个选项更适合执行window.setTimeout以及为什么?

选项A:

window.setTimeout(somefunc,0);

选项B:

window.setTimeout(somefunc,n); //n may be any number >0

感谢。

6 个答案:

答案 0 :(得分:2)

关于超时或间隔的事情,他们总是在执行自己的函数之前等待当前线程耗尽 - 即使你把它放在第一行。

var color='white';
setTimeout(function(){alert(color+' from timeout')}, 0);
for(var i=0;i<100001;++i){
    if(i=100000)alert(color='green');
}
alert(color='red')

答案 1 :(得分:1)

选项A只会调用somefunc而不必要地调用setTimeout的额外开销(因为你的第二个参数意味着 0毫秒的延迟)。如果您打算在执行somefunc之前有延迟,则选项B适用。你能详细说明一下,还是回答你的问题?

答案 2 :(得分:1)

这取决于你想做什么。

仅仅调用somefunc为

setTimeout(somefunc,0)并没有那么不同 (但我猜.setTimeout(somefunc,0)将首先完成当前阻止,然后调用somefunc

如果您需要等待浏览器呈现,然后再运行somefunc,请使用window.onload或jQuery的$(document).ready

答案 3 :(得分:0)

window.setTimeout(somefunc,0);

会立即运行somefunc(但在继续之前不会等待返回值)

window.setTimeout(somefunc,n);

会在运行somefunc之前等待n毫秒(但不会等到它继续启动或返回)

或者如果在没有超时的情况下调用somefunc(),它将运行somefunc但等待它继续完成。

将setTimeout视为“开始”新线程。

答案 4 :(得分:0)

我记得在使用setTimeout (func, 0)时遇到一些浏览器问题,所以现在每当我想要有最短的延迟时,我都会setTimeout (func, 1)。请注意,对于大多数(所有?)浏览器,实际的最短延迟是某个数字n > 1(肯定是n > 0,可能是n < 50)。

我遇到问题的哪个浏览器我不记得了。

答案 5 :(得分:0)

注意setTimeout(fn,0)不一定能确保在当前的callstack展开后立即调用函数fn - 可能不是一个非常重要的区别。

,浏览器可以在之前代码点击 setTimeout(fn,0)[可能是setTimeout之前的代码涉及一些CPU密集型计算]。 See example here

function clickHandler () {
    spinWait(1000);
    setTimeout(relayFunc, 0);
    //the jsFiddle link shows that relayFunc
    //will not be called after the clickHandler
    //if another event was queued during spinWait()
}

对于除了常见的“让dom元素首先呈现”之外的setTimeout的用法,请参阅my blog here