何时调用setTimeout注册的函数?

时间:2011-06-07 14:27:35

标签: javascript settimeout execution

它可能在'some'正常代码执行后被调用?但我不确定...... 如果某种方式能够描绘出如何在浏览器中执行javascript代码的大局,那就太棒了。

3 个答案:

答案 0 :(得分:1)

大多数情况下,浏览器执行线程空闲,而不是运行任何代码。当您使用setTimeout注册要执行的某个函数时,它将在给定的毫秒数之后执行。

现在:如果在给定的时间内执行其他一些代码(如事件处理程序或长循环),则浏览器工作线程正忙,您的函数将不得不等待。请考虑以下代码:

setTimeout(f, 500);
for(var i = 0; i < 10000000; ++i){
    //...
}

setTimeout立即返回,允许执行循环。如果此循环运行超过500毫秒,它将不会被中断,您的f函数将不得不等待。如果以下情况发生同样的情况490毫秒,你会触发一些冗长的事件处理程序。

将浏览器JS工作线程视为具有单个使用者和多个生成器的队列。队列中的某些项目可以立即获取(如事件处理程序),有些项目必须等到超时到期。

答案 1 :(得分:1)

Javascript是单线程的,并使用callstack运行,这基本上是先到先服务处理。

setInterval和setTimeout函数在提供的持续时间结束后将传递的函数放入callstack。这里的区别是结果不会在那时执行,它们只是被放入callstack中,所以如果某些东西已经运行,它将不会执行你在超时中提供的函数,直到你完成。

例如:

var i = 0;
setTimeout(function() { i = 1; }, 10);
for (; i < 1;) {}

你永远不会离开那个for循环,即使在10ms之后,调用i设置为1的函数,它只在callstack上,并且在for循环完成之前不会生效。

答案 2 :(得分:0)

也许我不理解这个问题..但这是直接来自window规范。

  

setTimeout(函数,毫秒)   此方法调用该函数一次   在指定的数量之后   毫秒过去,直到取消   通过调用clearTimeout。方法   返回可以使用的timerID   随后调用clearTimeout   取消间隔。

Reference

基本上,在您指定的毫秒数过去后立即调用该函数。