[英]The eventloop in JavaScript, why is there inconsistent behaviour in setTimeout
我试图找出为什么这两个脚本的行为不同:
在第一种情况下,第一个函数的setTimeout
为10毫秒。
这可以确保我的第二个函数(其setTimeout
为0毫秒)首先执行:
setTimeout(()=> { for(var x = 0; x < 1000000000; x ++) { Math.pow(32, 13); // time consuming operation if (x == 999999999) console.log('bla') } }, 10); setTimeout(()=> { console.log('test') }, 0);
在秒示例中,我具有完全相同的功能,但setTimeout
为1和0,而不是10和0。
与第一个片段不同,在第一个片段中,首先执行0的超时,而setTimeout
的0实际上等待setTimeout
的1完全执行。
setTimeout(()=> { for(var x = 0; x < 1000000000; x ++) { Math.pow(32, 13); // time consuming operation if (x == 999999999) console.log('bla') } }, 1); setTimeout(()=> { console.log('test') }, 0);
这意味着第一个函数的输出为:
测试
BLA
而第二个输出是
BLA
测试
是什么原因导致这种情况发生?
setTimeout
函数的延迟值固定不变,这意味着将忽略0并将其设置为最小值(通常为4ms或10ms,具体取决于浏览器)。 此外,如果选项卡处于非活动状态,则超时可能会进一步延迟。
但是,当您给定setTimeout
值1时,它将在1毫秒后调用它。 JavaScript不会忽略setTimeout
值1,但可以忽略0。
postMessage
是代替setTimeout
为0的最佳方法。
当您使用这种小的时间差(一个值是零)时,还有一件事情,然后有时它会根据它们在代码中的顺序执行该函数。
为了进行检查,您可以将setTimeout
值0放在setTimeout
值1函数之前。 它将首先运行setTimeout
值0,然后运行setTimeout
值1。
有关4ms钳位详细信息的参考,您可以查看此https://developer.mozilla.org/zh-CN/docs/Web/API/WindowTimers/setTimeout#Reasons_for_delays_longer_than_specified
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.