这里主要是结合Event Loop
来谈JS代码是如何执行的。
读这部分的前提是已经知道了JS引擎是单线程,而且这里会用到前面说的的几个概念:(如果不是很理解,可以回头温习)
-
JS引擎线程
-
事件触发线程【轮训】
-
定时触发器线程
然后再理解一个概念:
-
JS分为同步任务和异步任务
-
同步任务都在主线程上执行,形成一个
执行栈
-
主线程之外,事件触发线程管理着一个
任务队列
,只要异步任务有了运行结果,就在任务队列
之中放置一个事件【回调方法】。 -
一旦
执行栈
中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列
,将可运行的异步任务添加到可执行栈中,开始执行。扫描二维码关注公众号,回复: 4077151 查看本文章
看到这里,应该就可以理解了:为什么有时候setTimeout推入的事件不能准时执行?因为可能在它推入到事件列表时,主线程还不空闲,正在执行其它代码,
所以自然有误差。
再重复一下:
-
主线程运行时会产生执行栈,
栈中的代码调用某些api时,它们会在事件队列中添加各种事件(当满足触发条件后,如ajax请求完毕)
-
而栈中的代码执行完毕,就会读取事件队列中的事件,去执行那些回调
-
如此循环
-
注意,总是要等待栈中的代码执行完毕后才会去读取事件队列中的事件