gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 13:16:31 25 4
gpt4 key购买 nike

我是 Javascript 新手,最近了解了 setTimeout 设置为 0 毫秒的用法。我正在尝试实现它,但没有达到预期的效果。据我所知,它必须等到所有事件完成,但它的行为并不符合预期。请告诉我我遗漏了什么或我错在哪里。

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 !!

谢谢:)

最佳答案

setTimeout 延迟为 0,等待当前调用堆栈清除,而不是事件队列。其他超时都将回调排入队列,因此它们不是调用堆栈的一部分。

如果您要立即调用日志记录函数,则 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

MDN explains it :

even though setTimeout was called with a delay of zero, it's placed on a queue and scheduled to run at the next opportunity, not immediately. Currently executing code must complete before functions on the queue are executed, the resulting execution order may not be as expected.

Jeremy Starcher在他们删除的答案中提到,0 的延迟是软 0ms。它将把回调放在队列的顶部,但不保证它实际上会立即运行。当前上下文必须退出,这可能是立即发生的,也可能永远不会发生。最重要的是,浏览器只是偶尔检查队列中是否有挂起的回调,因此实现可能会引入额外的延迟。

关于javascript - 为什么setTimeout 0在函数结束时没有执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37463656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com