SetTimeout奇怪的执行代码

时间:2016-12-21 12:18:17

标签: javascript

我正在分别执行Part1Part2Part3Part4(在不同的文件中)。

我疏远了代码的执行。 为什么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

2 个答案:

答案 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”写入控制台。您必须按照需要执行的顺序放置语句。