单线程
单线程顾名思义只有一个线程,同一时间只能做一件事情。但为什么JS是单线程而不是跟java那样多线程呢?因为要避免DOM渲染的冲突,为保证浏览器在渲染节点的同时不能执行JS,如果渲染时JS代码还在执行,刚搞执行的代码在操作要渲染的DOM,这就造成渲染冲突。
1 | // 例子1:循环运行期间,JS 执行和 DOM 渲染会暂时卡顿,直到循环结束 |
简单总结:
- 浏览器需要渲染DOM
- JS 可以更改DOM结构
- JS 执行的时候,浏览器 DOM 渲染暂停。反之渲染DOM时 JS 暂停执行
- 不仅时 JS 和渲染会产生冲突,两端 JS 也不能同时执行,会存在同时修改同个DOM的情况(修改冲突)。
web worker
支持多线程,但不能访问DOM
目前的解决方案:异步
异步存在的问题:
- 没有按照书写方式执行,可读性差
- callback 不容易模块化,容易产生回调炼狱
事件轮询(event-loop)
什么是 event-loop
event-loop 是实现 JS 异步的具体解决方案,
同步代码,直接在主线程按顺序执行
异步函数先放在异步队列中
待同步函数执行完毕,再来轮询执行异步队列的函数,将要执行的函数放会主线程中