JavaScript回调是否会被阻止?

时间:2015-04-18 06:29:14

标签: javascript asynchronous

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

我在浏览器中试过这个:

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

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

    console.log('callback end');
}

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

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

1 个答案:

答案 0 :(得分:8)

浏览器中的Javascript是单线程的,可以处理事件队列。在触发下一个事件之前,一个事件将运行完成。因此,如果在第一次处理仍然处理时发生第二次单击,则第二次单击将排队,并且在处理完第一次的代码完成之前不会运行。

您可以在此处详细了解此事件队列概念:

How does JavaScript handle AJAX responses in the background?


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

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