一、setTimeout
1.原理
setTimeout(function(){
/*do something*/
},N);
等待N秒后,往消息队列插入一条定时器事件消息,第一个参数作为回调函数;
而当执行栈内同步任务执行完毕时,线程从消息队列读取消息,将该异步任务入栈,执行;线程空闲时再次从消息队列读取消息。
2.时间不准确
- 在读取消息队列的消息时,得等同步任务完成,这个是需要耗费时间的;
- 消息队列先进先出原则,读取此异步事件消息之前,可能还存在其他消息,执行也需要耗时;
所以异步执行时间不精确是必然的,但是无论是同步任务还是异步任务,都不应该耗时太长,当一个消息耗时太长时,应该尽可能的将其分割成多个消息。
二、setInterval
1.原理
var timerID = setInterval(function(){
/*do something*/
},N);
clearInterval(timerID);
setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。
三、同样的循环调用机制
setTimeout(function(){
...
setTimeout(arguments.callee,10);
},10);
setInterval(function(){...},10);
- 可使得setTimeout循环触发。但是,执行完这段代码块才挂起时间,所以两次执行时间会大于10ms
- 是自动在10ms的时候挂上这个事件,所以两次事件的相隔会小于等于10ms
- 清除 clearTimeout / clearInterval
网友评论