定时器的执行原理:
因为js是单线程的,而定时器不能像多线程那样指定时间运行,它在js中仅仅只是计划代码在未来的某个时间执行,执行的时机是不能保证的。实际上浏览器负责进行排序,指派某段代码在某个时间点运行的优先级。定时器对队列的工作方式是当特定时间过去后将代码插入,执行的时间还未确定,只有当等主线程空闲时且该函数代码位于队首,才会执行函数代码。
setInteral的问题
setInteral这个函数在一段时间后在js线程中插入代码,但是在线程中如果有很久的其他函数代码运行,就会插入很多次代码。但是,js引擎聪明,只有在线程中没有setInteral的代码才会插入代码。因此这种重复定时器的规则有两个问题(1)某些间隔会被跳过(2)多个定时器的代码执行之间的间隔可能会比预期的小。
为了避免setInteral的这2个问题,在js高级教程设计中解决方式是链式调用
setTimeout(function(){
setTimeout(arguments.callee,interval)
},interval)