如果我向事件监听器注册了一个耗时的回调函数,那么这个事件会在短时间内触发两次。第二个回调是否会被第一个回调阻止?
我在浏览器中试过这个:
document.body.onclick = function() {
var date = new Date;
console.log('click event at ' + date);
while(new Date - date < 1e4) {};
console.log('callback end');
}
结果,第二个回调在第一个回调完成后立即执行。
所以现在我对JavaScript非阻塞异步模块感到困惑:哪个部分是异步执行的?
答案 0 :(得分:8)
浏览器中的Javascript是单线程的,可以处理事件队列。在触发下一个事件之前,一个事件将运行完成。因此,如果在第一次处理仍然处理时发生第二次单击,则第二次单击将排队,并且在处理完第一次的代码完成之前不会运行。
您可以在此处详细了解此事件队列概念:
How does JavaScript handle AJAX responses in the background?
在您的特定示例中,一旦您的代码开始运行,它就是全部同步的。 while
循环运行直到完成并阻塞(保持其他任何Javascript运行直到完成)。
有一些异步方法可以安排将来运行的某些代码(使用setTimeout()
或setInterval()
),允许其他代码在此期间运行,但您没有使用该机制。