我们都知道js有setInterval和setTimeout异步方法,ajax请求也是异步的,但你知道它为什么可以做到异步吗?
先说答案: js的异步不是真正的异步,它是通过浏览器的事件驱动实现的异步。简单来说就是浏览器内核中(也就是浏览器渲染进程内):定时器线程或者http请求线程配合事件触发线程实现的异步。当有定时器或者ajax请求时,事件触发线程会将定时器执行完毕的回调和ajax请求的回调添加进待处理队列的尾部(配合事件循环理解),等待js引擎线程来处理。这样也就形成了异步。
再说说浏览器内核(浏览器渲染进程):浏览器是多进程的,其中我们最关注的就是渲染进程,渲染进程中又是多线程的:
- 图形线程 - 渲染页面 与 js引擎线程
互斥,js执行时图形线程就会挂起 - js引擎线程 - v8引擎 图形线程 与 js引擎线程互斥,js执行时图形线程就会挂起
- 事件触发线程 - 控制事件循环
- 定时器线程 - 处理定时器事件
- http请求线程 - 处理网络请求事件
以上配合上述描述应该会更好理解。