参考:http://www.javashuo.com/article/p-apnenkgt-db.htmlsegmentfault
Javascript设计之初就是一门单线程语言,Event Loop就是为了解决主线程不阻塞的问题。浏览器
一、js中有同步任务、异步任务两种数据结构
二、同步任务在JS引擎线程执行,造成执行栈异步
三、异步任务在已有异步操做结果符合触发条件时,进入任务队列(由事件触发线程管理)等待执行oop
四、执行栈中的任务运行完成后(JS引擎空闲),从任务队列中读取任务,加入到执行栈,并执行spa
一、定时器是独立线程控制:线程
定时触发是由定时器线程控制的,这是由于JavaScript引擎是单线程的, 若是处于阻塞线程状态就会影响记计时的准确,所以颇有必要单独开一个线程用来计时。设计
二、定时器实现流程blog
定时器实如今预先设定的时间后,将事件推入任务队列,等待执行栈执行。因为定时事件在推入任务队列中时,JS引擎线程正在执行其余任务,这时要定时事件要等待JS引擎线程空闲才能执行,就可能出现定时事件不能准时执行队列
三、对于0毫秒的定时:
W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms,但不排除不一样浏览器最小事件设置不一样。
即使时间间隔为0也须要进入任务队列等待JS引擎线程空闲的过程,执行栈中的任务仍是早于定时任务执行