javascript - 关于JS的事件队列问题
本文介绍了javascript - 关于JS的事件队列问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
function waitThreeSeconds() {
var ms = 3000 + new Date().getTime();
while (new Date() < ms) {}
console.log('finished function');
}
function clickHandler() {
console.log('click event!');
}
document.addEventListener('click', clickHandler);
waitThreeSeconds();
console.log('finished execution');
代码运行等待3秒钟打印出finished function和finished execution,问题在于在这3秒里点击页面,没有触发clickHandler,而且等待前面两个打印出来才有显示,解释下为啥点击最后才执行?
解决方案
同楼上回答。
javascript 是的单线程的,于是就产生了一种任务执行机制叫 eventloop
。它维护了一个任务队列,完成一个任务才会开始下一个任务。
你的 waitThreeSeconds
函数中的 while
会在将当前队列堵塞三秒钟,即使在这3秒内你触发了 click
,这个任务会被推入队列等待执行。
‘即使在这3秒内你触发了 click’ 这一句话可能会让你觉得和 ‘单线程’ 有些冲突,明确的来说: 执行javascript 确实是单线程。 至于为什么在队列被堵塞的时候,异步任务依旧会被加入队列,这就和浏览器的实现有关系了(浏览器可是多线程的)
这篇关于javascript - 关于JS的事件队列问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文