看看下面的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秒钟以上
相反,我看到以下输出:
此行为背后的原因是什么?
答案 0 :(得分: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
。