看看以下Javascript代码:
var content = document.body
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
}
setTimeout(function () {
content.innerText = "callback called"
}, 2000)
content.innerText = "timeout set"
setTimeout(function () {
content.innerText = "one second passed, sleeping for 4 more seconds"
pausecomp(4000)
}, 1000)
我期待在页面上显示以下输出:
由于第二个回调将在第一个回调之前排队,因此它将阻塞堆栈4秒钟
相反,我看到以下输出:
这种行为背后的原因是什么?
您所看到的行为是阻止DOM呈现的单线程同步执行的结果。
这是发生的事情:
innerText
设置为timeout set
。setTimeout
在1秒后开火。innerText
设置为one second passed, sleeping for 4 more seconds
,但浏览器在释放执行线程之前不会重新呈现DOM。pausecomp
同步保持线程4秒。pausecomp
完成并且第一个setTimeout
立即执行,因为此时它已经排队了。innerText
将被设置为callback called
。callback called
。