首先, 我们需要明白一些东西
- javascript是一门 单线程语言, 且其运行在浏览器中
- 浏览器运行并不是单线程, 我们需要区分清楚
- javascript运行在浏览器的一个渲染主线程里面, 即浏览器多个线程的其中一个线程里面
带着上面的结论我就可以开始理解javascript的运行机制。首先在页面的加载过程中, 不仅有javascript语言的运行, 也有html、css的加载和运行, 在javascript中还有计时器、网络请求、时间监听等。例如一种情况, 假如在页面正在渲染在的过程中某一个发送了某一个网络请求, 这个时候浏览器无需等待请求结果, 它会创建一个网络请求线程来等待请求结果, 让页面正常渲染, 否则这时页面会卡死, 造成非常差的体验, 当网络请求得到结果时我们需要停止当前的渲染进程吗? 答案也是不需要。浏览器会将网络请求的回调事件追加到javascript的运行线程里面的任务队列里面的最后一个, 当主进程里面的事件都执行完成后, 主进程会循环读取任务队列里面的任务然后顺序执行, 当其中一个任务里面有其他任务时再追加到任务队列的最后一个, 当任务队列里面的任务全部执行完毕, 此进程开始循环访问任务队列有没有任务, 当有任务时开始循环执行任务队列里面的任务, 循环往复
请参照下图理解