javascript - 为什么下面的代码会按照这个顺序执行呢?

标签 javascript

当我运行以下代码时(通过单击按钮):

const div = document.querySelector( "div" )
const button = document.querySelector( "button" )
button.addEventListener( "click", () => {
    console.log( 'clicked' );
    div.textContent = 'printing....';
    var delay = 3000 + new Date().getTime();
    while ( new Date().getTime() < delay ) { }
    console.log( 'after delay' );
} );
<button>Run</button>
<div></div>

回调完成后显示div的内容, 所以我点击第一个日志(“点击”),然后在 3 秒延迟循环后点击第二个日志(“延迟后”)和 div 内的文本。 为什么 div.textContent = '正在打印......'; 在第一个 console.log() 之后没有执行? 非常感谢(我是编码和 stackoverflow 的新手,所以如果我不清楚或愚蠢,请原谅我)

最佳答案

Javascript 是单线程的(大部分)。您正在使用繁忙的循环锁定线程,因此在您的函数完成之前,浏览器将没有机会使用您的更改来更新页面。

相反,您需要进行一些更改,然后设置超时,然后返回,允许浏览器进行绘制。稍后,当超时结束时,您可以进行更多更改。

button.addEventListener( "click", () => {
  console.log( 'clicked' );
  div.textContent = 'printing....';
  setTimeout(() = > {
    console.log('after delay');
  }, 3000);
});

关于javascript - 为什么下面的代码会按照这个顺序执行呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55941063/

相关文章:

javascript - 如何使用 jQuery 更改背景图像属性(线性渐变)?

javascript - 基于 Ajax 的 Web 应用程序的替代 "html"接口(interface)

javascript - 使用html在浏览器中显示JSON字典

javascript - 如何在 JavaScript 中动态命名和创建对象?

javascript - 在 tinyMCE 中自定义 HTML 文本所需的帮助

javascript - gulp - 完成时发出哔哔声

javascript - 在指令中编译后获取元素的内容

javascript - 在 jQuery 中显示/隐藏父 div 中的元素

javascript - 如何使用矩阵从左上角缩放对象?

javascript - 为响应式设计调整 ckeditor 的大小