在web开发中,常使用js做交互,通过ajax请求API获取数据更新局部页面。在学习js的时候,我们一直听到js既是单线程的又js是异步的,想必大家对这里同样也有些困惑吧。
本文是对这个问题的思考的记录。
结论
js解析引擎本身是单线程的,即在同一时刻,有且仅有一行代码正在执行。ajax call是web API,它是委托给浏
览器执行的,浏览器会有一个模块去处理网络io(一个单独的线程或者共用一
个线程),具体怎么实现,需要研究浏览器的实现,本文没有深入研究。
- 浏览器的内核包括渲染引擎和js引擎,以chrome为例,v8 engine只是js引擎
- js是单线程的,它的call stack是单线程
- call stack运行ajax后,把网络io交给chrome另外一个线程去做,当io结束后,进入task queue等待;当call stack栈空时,触发event,event loop去调用排在task queue前面的function,交给call stack去运行
- 这里有个问题,上面去做io的线程采用哪种实现方式,是异步io,还是多路复用io,这些都是依赖于操作系统