Javascript 循环始终完成,即使设置超时也是如此

Javascript 循环始终完成,即使设置超时也是如此,javascript,settimeout,Javascript,Settimeout,我正在运行一些JavaScript代码来测试/理解setTimeOut的行为 我使用以下代码: var timerx1 ; if (timerx1) window.clearTimeout(timerx1); timerx1 = setTimeout(testme, 10); 要调用此函数,请执行以下操作: function testme() { for (var c = 0; c < 900000; c++) { document.getElementById

我正在运行一些JavaScript代码来测试/理解setTimeOut的行为

我使用以下代码:

var timerx1 ;

if (timerx1) window.clearTimeout(timerx1);
timerx1 = setTimeout(testme, 10);
要调用此函数,请执行以下操作:

function testme() {
    for (var c = 0; c < 900000; c++) {
        document.getElementById("divMode").innerHTML = c;
    } 
}
函数testme(){
对于(var c=0;c<900000;c++){
document.getElementById(“divMode”).innerHTML=c;
} 
}
此循环将始终在退出之前完成

我原以为10毫秒的setTimeOut将“启动”,循环在完成之前中止

我强调这不是任何其他代码或应用程序的一部分。我只是想了解setTiemOut的工作原理和限制。

不会中断或“超时”您的循环:它只是在经过这么长时间后调用回调函数

在指定的延迟后调用函数或执行代码段

不会中断或“超时”循环:它只是在经过这么长时间后调用回调函数

在指定的延迟后调用函数或执行代码段


setTimeout等待指定的毫秒,然后执行函数。。在您的示例中,您正在等待10ms,等待指定的毫秒并执行函数。。在您的示例中,等待10毫秒,Javascript在堆栈上运行任务。for循环完全作为这些循环之一执行。当您使用
setTimeout
时,它会接受传入的函数并将其附加到该任务堆栈的末尾。然后,它将在适当的时候执行该任务

                              // current thread  | waiting
doSomething();                //   execute now   |    --
setTimeout(doSomething, 10);  // append to stack | doSomething (8ms left)
doSomethingElse();            //   execute now   | doSomething (5ms left)
// End of current thread      //      --         | doSomething (0ms left) do this next
                              //    doSomething  |    --

SetTimeout立即返回,就好像它已完成一样。它基本上将函数分配到挂起状态,并将在当前线程完成(当前函数结束/返回)和超时计时器完成后执行。

Javascript在堆栈上运行任务。for循环完全作为这些循环之一执行。当您使用
setTimeout
时,它会接受传入的函数并将其附加到该任务堆栈的末尾。然后,它将在适当的时候执行该任务

                              // current thread  | waiting
doSomething();                //   execute now   |    --
setTimeout(doSomething, 10);  // append to stack | doSomething (8ms left)
doSomethingElse();            //   execute now   | doSomething (5ms left)
// End of current thread      //      --         | doSomething (0ms left) do this next
                              //    doSomething  |    --

SetTimeout立即返回,就好像它已完成一样。它基本上将函数分配到挂起状态,并将在当前线程完成(当前函数结束/返回)和超时计时器完成后执行。

setTimeout函数调用名为“LiveFeed”的函数,而不是“testme”的函数。除了抛出错误外,没有任何东西会中断循环,或者浏览器quitting.lol-谢谢你指出这一点!:)@Cookie Monster嗨,谢谢你确认这一行为。那么,如果setTimeOut实际上没有超时,那么使用它有什么意义呢?你完全误解了
setTimeOut
。您的setTimeout函数调用名为“LiveFeed”的函数,而不是“testme”,除了抛出错误或浏览器退出之外,没有任何东西会中断您的循环。lol-感谢您指出这一点!)@Cookie Monster嗨,谢谢你确认这一行为。那么,如果setTimeOut实际上没有超时,那么使用它有什么意义呢?你完全误解了
setTimeOut
。我想我会问,尽管这与最初的问题不同,但在不同的线程上执行会使代码“更快”吗?@AndrewSimpson这取决于代码。如果你谈论的是需要时间来执行的事情,那么理论上是的。但是使用setTimeout会对性能造成轻微影响。请记住JavaScript不是多线程的。它只会推迟执行。它仍然在一个线程中串行执行。订单被推迟了。嗨。又是一个很好的明确答案。因此,如果我想连续执行代码,但无法保证需要多长时间,那么setinterval也将不起作用。@AndrewSimpson您不需要setinterval,它将继续推送到堆栈。setTimeout将允许您对它们进行批处理。看一个管理变量执行时间的例子。我想我会问,尽管这与最初的问题不同,但在不同的线程上执行会使代码“更快”吗?@AndrewSimpson这取决于代码。如果你谈论的是需要时间来执行的事情,那么理论上是的。但是使用setTimeout会对性能造成轻微影响。请记住JavaScript不是多线程的。它只会推迟执行。它仍然在一个线程中串行执行。订单被推迟了。嗨。又是一个很好的明确答案。因此,如果我想连续执行代码,但无法保证需要多长时间,那么setinterval也将不起作用。@AndrewSimpson您不需要setinterval,它将继续推送到堆栈。setTimeout将允许您对它们进行批处理。请看一个关于管理可变执行时间的示例。