Javascript 为什么在JS函数调用完成后应用样式?

Javascript 为什么在JS函数调用完成后应用样式?,javascript,ajax,Javascript,Ajax,当我在navigator的js开发控制台中运行updateBgColor()时,我得到了这个代码示例。函数调用完成后,颜色正在更新。有人能解释一下这种行为吗?我该如何在睡眠前强制更新颜色(4000) 注意:在我的过程中,睡眠(4000)将被可能需要几秒钟的长任务所取代 <html> <head> <script> function sleep(milliseconds) { const date = Date.now();

当我在navigator的js开发控制台中运行
updateBgColor()
时,我得到了这个代码示例。函数调用完成后,颜色正在更新。有人能解释一下这种行为吗?我该如何在
睡眠前强制更新颜色(4000)

注意:在我的过程中,
睡眠(4000)
将被可能需要几秒钟的长任务所取代

<html>
<head>
  <script>
      function sleep(milliseconds) {
        const date = Date.now();
        let currentDate = null;
        do {
          currentDate = Date.now();
        } while (currentDate - date < milliseconds);
      }
      function updateBgColor()
      {
          document.bgColor="green";
          sleep(4000);
      }
  </script>
</head>
<body></body>
</html>

函数睡眠(毫秒){
const date=date.now();
让currentDate=null;
做{
currentDate=Date.now();
}while(currentDate-日期<毫秒);
}
函数updateBgColor()
{
document.bgColor=“绿色”;
睡眠(4000);
}
有人能解释一下这种行为吗

浏览器在JS函数的中间不重画DOM。它允许他们将多个DOM更改堆叠起来,然后只有在为了效率而完成所有更改后才重新绘制

如何在睡觉前强制更新颜色(4000)

不要将长时间运行的阻塞代码放在主事件循环上


您可以将其转包给webworker。

同样,您已经用Ajax标记了它–希望“长任务”不是同步Ajax请求?如果Ajax调用是异步的,问题就会自动消失。@GuyIncognito即使是异步的,长阻塞任务也不会阻塞吗?@evolutionxbox我不理解这个问题。“阻塞”和“异步”是两个相反的概念。由于大多数(如果不是所有)浏览器都将JS实现为单线程,因此即使设置为异步,阻塞的函数仍将阻塞。他们不是完全对立的。昆廷的回答恰到好处。