JS单线程
-
设计原因:
- JS的主要用途是与用户交互,以及操作DOM。如果是多线程的话,一个线程为某个DOM节点添加内容,另一个线程删除了这个节点,这时的浏览器以哪个为准会是比较复杂的问题,所以这样设计避免了复杂性
-
异步API的执行:
- 诸如onclick回调,setTimeout. Ajax这些的实现是因为浏览器和nodejs是多线程的,比如说浏览器有GUI渲染线程,JS引擎线程,定时器触发线程,浏览器事件线程,http异步线程,EventLoop轮询处理线程等等(为了避免js操作dom而造成与GUI渲染的冲突,所以GUI渲染线程和JS引擎线程是互斥的)
-
JS代码的执行分为三个个部分,执行栈、消息队列和事件循环处理机制,事件循环处理机制是前两者的桥梁
-
JS引擎线程,或者叫主线程,运行的时候会生成执行栈,用于处理函数嵌套,执行上下文进栈出栈
-
而消息队列是一个存储异步成功后的回调函数的队列,先成功的异步回调函数放在队列前面,后成功的放在队列后面(注意这里是定时器触发线程,浏览器事件线程,http异步线程这些线程把异步api执行成功后,才会将回调函数丢进队列当中)
-
当执行栈中的同步代码都执行完了,事件循环轮询处理线程回去看消息队列里有没有需要执行的回调函数,有的话将其放入执行栈中执行,主线程只有在当前的消息执行完成后,才会去取下一个消息,取一个消息并执行的过程叫做一次循环,所以叫事件循环机制
-