Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么setTimeout 0没有在函数末尾执行_Javascript - Fatal编程技术网

Javascript 为什么setTimeout 0没有在函数末尾执行

Javascript 为什么setTimeout 0没有在函数末尾执行,javascript,Javascript,我是Javascript新手,最近了解了setTimeout设置为0毫秒的用法。我试图实现它,但没有得到预期的结果。据我所知,它必须等到所有事件结束,但它的行为并不符合预期。请告诉我我错过了什么或哪里错了 index.html 我期待着像这样的事情 Event 1 Processed !! Event 2 Processed !! Event 3 Processed !! Event 0 Processed !! 谢谢:)这些语句的执行时间为0到3000毫秒 据我所知,它必须等到所有的活

我是Javascript新手,最近了解了setTimeout设置为0毫秒的用法。我试图实现它,但没有得到预期的结果。据我所知,它必须等到所有事件结束,但它的行为并不符合预期。请告诉我我错过了什么或哪里错了

index.html 我期待着像这样的事情

Event 1 Processed !!

Event 2 Processed !!

Event 3 Processed !!

Event 0 Processed !!

谢谢:)

这些语句的执行时间为0到3000毫秒

据我所知,它必须等到所有的活动结束


不,它们应该等待指定的时间(0、1000、2000或3000毫秒)

这些语句在0到3000毫秒之间执行

据我所知,它必须等到所有的活动结束


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

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

如果要立即调用日志函数,0超时将等待该函数完成,但不会等待其他超时。例如:

函数日志(n){
log(“事件”,n,“已处理!”);
}
setTimeout(log.bind(null,0),500);//等待0.5秒
setTimeout(log.bind(null,1),0);//等待堆栈清除

日志(2);//立即运行
设置超时
,延迟
0
等待当前调用堆栈清除,而不是事件队列。其他超时都将回调排队,因此它们不是调用堆栈的一部分

如果要立即调用日志函数,0超时将等待该函数完成,但不会等待其他超时。例如:

函数日志(n){
log(“事件”,n,“已处理!”);
}
setTimeout(log.bind(null,0),500);//等待0.5秒
setTimeout(log.bind(null,1),0);//等待堆栈清除
日志(2);//当您有以下情况时,立即运行:

setTimeout(function () {
    document.write("<p>Event 0 Processed !!</p>");
},0);
setTimeout(函数(){
写入(“事件0已处理!!

”; },0);
几乎可以说:

document.write("<p>Event 0 Processed !!</p>");
document.write(事件0已处理!!

);
因为它在执行之前会等待0毫秒,所以请立即执行

如果希望顺序相反,则事件0的延迟需要最长

当您有此功能时:

setTimeout(function () {
    document.write("<p>Event 0 Processed !!</p>");
},0);
setTimeout(函数(){
写入(“事件0已处理!!

”; },0);
几乎可以说:

document.write("<p>Event 0 Processed !!</p>");
document.write(事件0已处理!!

);
因为它在执行之前会等待0毫秒,所以请立即执行


如果希望顺序相反,则事件0的延迟需要最长

您的意思是希望在setTimeout(…,0)之前看到调用setTimeout(…,1000)的结果?所有
setTimeout
调用可能都是异步的。它们都被添加到“队列”中,并在当前函数完成后(以及经过的时间)运行。0ms应该发生在1000ms之前。您的意思是希望在setTimeout(…,0)之前看到调用setTimeout(…,1000)的结果?所有
setTimeout
调用的可能重复都是异步的。它们都被添加到“队列”中,并在当前函数完成后(以及经过的时间)运行。0毫秒应该发生在1000毫秒之前。等待0毫秒和立即执行不是一回事。
setTimeout
的文档非常清楚,当前上下文完成后,它将使回调排队执行,可能是立即执行,也可能是从不执行。@ssube是的,我知道它们不是一回事。但就OP而言,因为他似乎只是在学习,所以这是一个足够好的解释。你不是从CS课程开始学习细节,而是一步一个脚印地学习。等待0毫秒和立即执行不是一回事。
setTimeout
的文档非常清楚,当前上下文完成后,它将使回调排队执行,可能是立即执行,也可能是从不执行。@ssube是的,我知道它们不是一回事。但就OP而言,因为他似乎只是在学习,所以这是一个足够好的解释。你不是从CS课程开始学习细节,而是一步一个脚印地学习。
document.write("<p>Event 0 Processed !!</p>");