哪个选项更适合执行window.setTimeout以及为什么?
选项A:
window.setTimeout(somefunc,0);
选项B:
window.setTimeout(somefunc,n); //n may be any number >0
感谢。
答案 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