#定时器
定时器可以(available)在JavaScript中使用,但我们没说它是JavaScript自身的一个功能——定时器不是JavaScript的一项功能。定时器作为对象和方法的一部分,才能在浏览器中使用。也就是说,如果我们在非浏览器环境中使用JavaScript,很可能定时器就不存在了。我们不得不使用特定实现的功能(如Rhino中的线程),来实现我们自己的定时器版本。
定时器提供了一种让一段代码在一定毫秒之后,再异步执行的能力。由于JavaScript是单线程的特性(同一时间只能执行一处JavaScript代码),定时器提供了一种跳出这种限制的方法,以一种不太直观的方式来执行代码。
##定时器和线程是如何工作的
###设置定时器
JS提供了两种方式设置定时器

方法 格式 描述
setTimeout id = setTimeout(fn,delay) 启动一个定时器,在一段时间(delay)之后执行传入的callback,并返回该定时器的唯一标识
clearTimeout clearTimeout(id) 如果定时器还未触发,传入定时器标识即可取消(清除)该定时器
setInterval id = setInterval(fn,delay) 启动一个定时器,在每隔一段时间(delay)之后都执行传入的callback,并返回该定时器的唯一标识
clearInterval clearInterval(id) 传入间隔定时器标识,即可取消(清除)该间隔定时器

JavaScript定时器的操作方法(均为window的方法)

这些方法允许我们设置和清楚定时器,可以让定时器在一个时间点后触发也可以每隔一段时间触发。

注:JavaScript定时器的延时时间是不能保证的

##执行线程中的定时器定时器执行
Web worker可用之前,浏览器中所有的JS代码都是在单线程中执行的。

##timeout和interval之间的区别

这两段代码功能似乎是相同的,但是在setTimeout()代码中要在前一个callback回调执行结束并延时10s(可能更多但不会更少)以后才能再次执行setTimeout(),而setInterval()则是每隔10ms就尝试执行callback回调,而不关注上一个callback是什么时候执行的。