javascript - 关于JS的事件队列问题
迷茫
迷茫 2017-04-11 12:43:11
0
2
268
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,而且等待前面两个打印出来才有显示,解释下为啥点击最后才执行?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复 (2)
大家讲道理

同楼上回答。

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

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

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

    小葫芦

    因为JS是单线程的,你这里的waitThreeSeconds()函数阻塞/占用了进程运行,必须要等这里运行完了,JS进程空闲了出来才能去触发的那堆事件。
    要想在这等待的三秒内也能也能触发,那就要使用异步函数。

      最新下载
      更多>
      网站特效
      网站源码
      网站素材
      前端模板
      关于我们 免责声明 Sitemap
      PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!