javaScript引擎是单线程的
- 这样就不会存在任务见间的相互影响:举个反列如果是多线程的情况下,同时两个任务,当任务A要删除一个DOM节点,任务B要去修改该节点的属性,这样是有问题的
- 由于是单线程执行,必然会存在代码长时间阻塞的情况,这时浏览器页面会卡斯,为了提高执行效率和用户体验,js实现异步执行
- 如何在单线程中实现异步执行了?
- 是通过的事件循环(event loop),以下三步循环执行,这就是event loop---理解了event loop机制,就理解了JS的执行机制
- 首先判断JS是同步还是异步,同步就进入主进程,异步就进入event table
- 异步任务在event table中注册函数,当满足触发条件后,被推入event queue
- 同步任务进入主线程后一直执行,直到主线程空闲时,才会去event queue中查看是否有可执行的异步任务,如果有就推入主进程中
- 是通过的事件循环(event loop),以下三步循环执行,这就是event loop---理解了event loop机制,就理解了JS的执行机制
--------------------------------------------------------------------------
js 线程 | 执行本轮其他任务 | 执行回调
--------------------------------------------------------------------------
| /|\
| |
\|/ |
发起异步调用 |----------------------------
| 事件列队 event queue | 回调1, 回调2, 回调3, 回调4···
| |----------------------------
/|\
| |
| |
| |
| ------------异步回调排队----------------------------
| |
\|/ |
--------------------------------------------------------------------------
异步调用线程 |执行异步任务|
event table | |
--------------------------------------------------------------------------