为什么setTimeout 0没有在函数结束时执行

时间:2016-05-26 14:24:59

标签: javascript

我是Javascript的新手,最近知道setTimeout设置为0 millis的用法。我正在尝试实现它,但没有得到预期的结果。根据我的知识,它必须等到所有事件都完成但它没有表现得很好。请告诉我我错过了什么或我错在哪里。

的index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test HTML</title>

</head>
<body>

    <script src="js/index.js"></script>
</body>
</html>

index.js

(function(){

    setTimeout(function () {
        document.write("<p>Event 0 Processed !!</p>");
    },0);

    setTimeout(function () {
        document.write("<p>Event 1 Processed !!</p>");
    },1000);

    setTimeout(function () {
        document.write("<p>Event 2 Processed !!</p>");
    },2000);

    setTimeout(function () {
        document.write("<p>Event 3 Processed !!</p>");
    },3000);

})();

输出

Event 0 Processed !!

Event 1 Processed !!

Event 2 Processed !!

Event 3 Processed !!

我期待像

这样的东西
Event 1 Processed !!

Event 2 Processed !!

Event 3 Processed !!

Event 0 Processed !!

谢谢:)

3 个答案:

答案 0 :(得分:6)

0延迟function log(n) { console.log("Event", n, "processed!"); } setTimeout(log.bind(null, 0), 500); // wait 0.5 seconds setTimeout(log.bind(null, 1), 0); // wait until the stack clears log(2); // run now等待当前调用堆栈清除,而不是事件队列。其他超时都将回调排入队列,因此它们不是调用堆栈的一部分。

如果您要立即调用日志记录功能,则0超时将等待该操作完成,但不会等待其他超时。例如:

&#13;
&#13;
0
&#13;
&#13;
&#13;

作为MDN explains it

  

即使调用setTimeout时延迟为零,它也会被放置在队列中,并计划在下一次机会运行,而不是立即运行。当前执行代码必须在执行队列上的函数之前完成,生成的执行顺序可能不是预期的。

在删除的答案中提及Jeremy Starcher时,print "MEDIA = %.1f\n"%(((a*2)+(b*3)+(c*5))/(10)) 的延迟为0毫秒。它会将回调放到队列的顶部,但不保证它实际上会立即运行。当前上下文必须退出,可以立即或永远不会发生。最重要的是,浏览器偶尔只会检查队列中是否有待处理的回调,因此实现可能会引入额外的延迟。

答案 1 :(得分:0)

这些语句从0到3000毫秒执行。

  

据我所知,它必须等到所有事件都结束..

不,他们应该等到您指定的时间(0,1000,2000或3000毫秒)

答案 2 :(得分:-1)

当你有这个:

setTimeout(function () {
    document.write("<p>Event 0 Processed !!</p>");
},0);

接近说:

document.write("<p>Event 0 Processed !!</p>");

因为它会在执行前等待0ms,所以马上就会这样。

如果您希望订单方向相反,那么事件0的延迟需要最长。