这是我的测试代码(小提琴here http://jsfiddle.net/Xvh55/):
console.log('Before wait');
setTimeout(function () { console.log('Yo!'); }, 1000);
var start = Date.now();
while (Date.now() < start + 3000) {}
console.log('After wait');
这是 Chrome 中事件的时间表:
- 时间 0 秒:打印“Before wait”
- 时间 3 秒:打印“After wait”,然后紧接着“Yo!”
这种行为符合规范吗?为什么不是
- 时间 0 秒:打印“Before wait”
- 时间 3 秒:打印“等待后”
- 时间 4 秒:打印“Yo!”
?
JavaScript 是单线程的。如果某个代码块使用执行线程,则无法执行其他代码。这意味着您的setTimeout()
调用必须等到主执行(忙等待的那个)while
循环)结束。
发生的事情是这样的:你安排setTimeout()
一秒后执行,然后阻塞主线程 3 秒。这意味着当你的繁忙循环结束时,超时已经晚了 2 秒 - 并且 JS 引擎试图通过尽快调用你的超时来跟上 - 即立即。
事实上这个:
while (Date.now() < start + 3000) {}
这是 JavaScript 中最糟糕的事情之一。您将 JavaScript 执行线程保持 3 秒,并且无法执行其他事件/回调。通常浏览器会在那段时间“冻结”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)