JavaScript回调是否会被阻止?

Dol*_*ood 5 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');
}
Run Code Online (Sandbox Code Playgroud)

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

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

jfr*_*d00 9

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

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

JavaScript如何在后台处理AJAX响应?


在您的特定示例中,一旦您的代码开始运行,它就是全部同步的.该while循环运行,直至竣工和阻止(从运行,直到它完成保留任何其他JavaScript).

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