JS 里的一种任务分类方式分为: 同步任务和异步任务
虽然 JS 是单线程的,但是浏览器的内核却是多线程的,在浏览器的内核中不同的异步操作由不同的浏览器内核模块调度执行,异步任务操作会将相关回调添加到任务队列中
而不同的异步操作添加到任务队列的时机也不同,比如onclick
, setTimeout
, ajax
处理的方式都不同
这些异步操作是由浏览器内核来执行的,浏览器内核上包含 3 种 webAPI
,分别是 DOM Binding(DOM绑定)
、network(网络请求)
、timer(定时器)模块
按照这种分类方式:JS
的执行机制是
- 首先判断
js
代码是同步还是异步,不停的检查调用栈中是否有任务需要执行,如果没有,就检查任务队列,从中弹出一个任务,放入栈中,如此往复循环,要是同步就进入主进程,异步就进入事件表 - 异步任务在事件表中注册函数,当满足触发条件后,被推入事件队列
- 同步任务进入主线程后一直执行,直到主线程空闲时,才会去事件队列中查看是否有可执行的异步任务,如果有就推入主进程中
以上三步循环执行,这就是事件循环(event loop),它是连接任务队列和控制调用栈的
在面试当中事件循环机制问得也比较多,如果您有疑问,欢迎评论下方留言,一起学习探讨