它可能在'some'正常代码执行后被调用?但我不确定...... 如果某种方式能够描绘出如何在浏览器中执行javascript代码的大局,那就太棒了。
答案 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 取消间隔。
基本上,在您指定的毫秒数过去后立即调用该函数。