每日一题day10:js的事件循环是什么?

127 阅读2分钟

是执行上下文,对函数的出栈和入栈的一个过程,由js的单线程特质决定

JS 里的一种任务分类方式分为: 同步任务异步任务
虽然 JS 是单线程的,但是浏览器的内核却是多线程的,在浏览器的内核中不同的异步操作由不同的浏览器内核模块调度执行,异步任务操作会将相关回调添加到任务队列中
而不同的异步操作添加到任务队列的时机也不同
按照这种分类方式:JS 的执行机制是:
1.首先判断 js 代码是同步还是异步,不停的检查调用栈中是否有任务需要执行,如果没有,就检查任务队列,从中弹出一个任务,放入栈中,如此往复循环,要是同步就进入主进程,异步就进入事件表

2.异步任务在事件表中注册函数,当满足触发条件后,被推入事件队列

3.同步任务进入主线程后一直执行,直到主线程空闲时,才会去事件队列中查看是否有可执行的异步任务,如果有就推入主进程中

以上三步循环执行,这就是事件循环(event loop),它是连接任务队列和控制调用栈的

事件循环的具体步骤

  1. 同步任务直接放入到主线程执行,异步任务(点击事件,定时器,ajax等)挂在后台执行,等待I/O事件完成或行为事件被触发。

  2. 系统后台执行异步任务,如果某个异步任务事件(或者行为事件被触发),则将该任务添加到任务队列的末端,每个任务会对应一个回调函数进行处理。

  3. 执行任务队列中的任务具体是在执行栈中完成的,全部执行完毕后,去读取任务队列中的下一个任务,继续执行,是一个循环的过程,处理一个队列中的任务称之为tick。

js 异步执行的运行机制。

  1. 所有任务都在主线程上执行,形成一个执行栈。
  2. 主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
  3. 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列"。那些对应的异步任务,结束等待状态,进入执行栈并开始执行。
  4. 主线程不断重复上面的第三步