为了账号安全,请及时绑定邮箱和手机立即绑定

关于JS的事件队列问题

关于JS的事件队列问题

慕少森 2018-09-05 14:14:16
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,而且等待前面两个打印出来才有显示,解释下为啥点击最后才执行?
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

javascript 是的单线程的,于是就产生了一种任务执行机制叫 eventloop。它维护了一个任务队列,完成一个任务才会开始下一个任务。

你的 waitThreeSeconds 函数中的 while 会在将当前队列堵塞三秒钟,即使在这3秒内你触发了 click ,这个任务会被推入队列等待执行。

‘即使在这3秒内你触发了 click’ 这一句话可能会让你觉得和 ‘单线程’ 有些冲突,明确的来说: 执行javascript 确实是单线程。 至于为什么在队列被堵塞的时候,异步任务依旧会被加入队列,这就和浏览器的实现有关系了(浏览器可是多线程的)


查看完整回答
反对 回复 2018-10-10
  • 1 回答
  • 0 关注
  • 655 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信