我正在分别执行Part1
,Part2
,Part3
和Part4
(在不同的文件中)。
我疏远了代码的执行。
为什么Part1
输出与A
B
类似
但我期待B
A
。
像Part4
一样。
你能否提出相同的确切原因。
//Part1
setTimeout(function(){ console.log('A') }, 1);
setTimeout(function(){ console.log('B') }, 0);
Out Put of console: A B
//Part2
setTimeout(function(){ console.log('A') }, 4);
setTimeout(function(){ console.log('B') }, 3);
Out Put of console: B A
//Part3
setTimeout(function(){ console.log('A') }, 3);
setTimeout(function(){ console.log('B') }, 4);
Out Put of console: A B
//Part4
setTimeout(function(){ console.log('A') }, 2000);
setTimeout(function(){ console.log('B') }, 0);
Out Put of console: B A
答案 0 :(得分:4)
setTimeout
函数的延迟值被钳制,这意味着0被忽略并设置为最小值(通常为4ms或10ms,具体取决于浏览器)。此外,如果选项卡处于非活动状态,则超时可能会进一步延迟。
但是当你给setTimeout
值1时,它会在1ms之后调用它。 Javascript不会忽略setTimeout
中的值1,但可以忽略0。
postMessage
是代替setTimeout
到0的最佳方式。
当你使用这个小的时间差(一个值为零)时,还有一件事,那么有时它会根据代码中的顺序执行函数。
要检查,您可以在setTimeout
值1功能之前将setTimeout
值设置为0。它将首先运行setTimeout
值0,然后运行setTimeout
值1。
答案 1 :(得分:0)
原因是javascript按照它们编写的顺序执行语句。例如,在您的代码中,您写了:
setTimeout(function(){ console.log('A') }, 1);
setTimeout(function(){ console.log('B') }, 0);
字面意思是:等待1毫秒,将“A”写入控制台,然后将“B”写入控制台。您必须按照需要执行的顺序放置语句。