事件循环机制

392 阅读2分钟

事件循环机制

个人见解,如有错误,请见谅

1.js是单线程的

(但H5 的Web Workers 可以实现多线程)

  • 例如 alert,会暂停当前主线程的执行,同时暂停异步线程的计时

  • 所有回调函数,都在主线程队列执行

  • 先执行同步代码,后执行异步代码的回调函数:
    先执行初始化代码( 3类:ajax,事件,setIemeout/Intervel 的声明代码 ),即 同步代码 然后在某个时刻执行他们的回调函数 , 即异步代码

  • 设置成 单线程的目的是:保证只有一个线程操作Dom

2.执行机制

  • 分线程由 浏览器执行,不由js引擎执行,因为,浏览器是多线程的,js是单线程的

  • 不同的异步操作添加到任务队列的时机不同,
    如 onclick, setTimeout, ajax 处理的方式都不同,这些异步操作是由浏览器内核的 webcore 来执行的,webcore 包含3种 webAPI,分别是 DOM Binding、network、timer模块。

  • 任务队列=消息队列=事件队列=callback queue
    事件循环机制:主线程的所有同步任务(同步代码)执行完后,再查看任务队列是否有待执行的异步任务,如果有,按照顺序一个一个将其放入主线程,执行回调函数,异步任务(异步代码 ),执行完一个异步任务,再去查看任务队列 ,不断的查看,执行,循环下去。

js执行代码时,
判断该段代码是同步任务还是异步任务: 同步任务直接放入主线程执行栈,异步任务 交给浏览器内核新开异步线程 执行,并注册事件表, 异步任务执行完后(时间到了,触发了事件), 将 异步任务的回调函数送入 任务队列(回调队列), 等待主线程的同步任务执行完后,查看任务队列里 是否有 异步任务 ,如果有 将任务队列的 回调函数送入 主线程 执行栈 执行,执行完后 ,再次查看 任务 队列 是否还有可执行的任务, 不停的 检查,和执行