使用setTimeout注册的函数何时调用

When is the function registered with setTimeout called?

本文关键字:何时 调用 函数 setTimeout 注册 使用      更新时间:2023-09-26

它可能是在执行"某些"正常代码后调用的?但我不确定。。。如果有一种足以描绘javascript代码在浏览器中执行的全貌,那就太好了。

大多数时候,浏览器执行线程都处于空闲状态,不运行任何代码。当您注册要使用setTimeout执行的某个函数时,它将不早于给定的毫秒数执行。

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

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

CCD_ 2立即返回,允许执行循环。如果这个循环运行超过500毫秒,它不会被中断,并且您的f函数将不得不等待。如果在例如490毫秒之后触发一些冗长的事件处理程序,也会发生同样的事情。

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

Javascript是单线程的,使用调用堆栈运行,本质上是先到先得的服务处理。

setInterval和setTimeout函数在提供的持续时间过后将传递的函数放入调用堆栈。这里的区别在于,结果在那个时候不执行,它们只是被放入调用堆栈中,所以如果某个东西已经在运行,它不会执行您在超时时提供的函数,直到您完成为止。

例如:

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

你永远无法摆脱for循环,即使在10ms后,将i设置为1的函数被调用,它只在调用堆栈上,在for循环完成之前不会生效。

也许我不理解这个问题。。但这是直接从window规范中获得的

setTimeout(函数,毫秒)此方法调用函数一次在指定数量的毫秒过去,直到取消通过调用clearTimeout。方法返回可用于对clearTimeout的后续调用取消间隔。

参考

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