JavaScript 回调是否阻塞?

Is JavaScript callbacks blocking?

如果我向事件监听器注册了一个耗时的回调函数,并且这个事件在短时间内触发了两次。第二次回调会不会被第一次回调阻塞?

我在浏览器中尝试过:

document.body.onclick = function() {
    var date = new Date;
    console.log('click event at ' + date);

    while(new Date - date < 1e4) {};

    console.log('callback end');
}

结果,在第一个回调完成后立即执行了第二个回调。

所以现在我对JavaScript非阻塞异步模块很困惑:哪一部分是异步执行的?

浏览器中的

Javascript 是单线程的,并在事件队列中工作。在触发下一个事件之前,一个事件将 运行 完成。因此,如果在第一次点击仍在处理时发生第二次点击,第二次点击将排队,并且不会 运行 直到代码处理第一次点击完成。

您可以在此处阅读有关此事件队列概念的更多信息:

How does JavaScript handle AJAX responses in the background?


在您的特定示例中,一旦您的代码开始 运行ning,它就是同步的。 while 循环 运行s 直到完成并且正在阻塞(保持 运行ning 中的任何其他 Javascript 直到它完成)。

将来有一些异步方法可以将某些代码安排到 运行(使用 setTimeout()setInterval()),同时允许其他代码到 运行 ,但您没有使用该机制。