在JavaScript中,有两种方式能够设置时延(time delay)。第一种方式很简单,这种方法会先等待所设定的时长,而后再运行函数代码。第二种也是同样,只是它会重复运行函数代码。浏览器
注意,许多浏览器的最小时延值在25到75毫秒之间,一些极速浏览器的最小时延可达3毫秒。若是设置的时延值小于浏览器的最小值,代码运行的实际时延就是就是浏览器的最小时延值。即使设置时延值高于最小值时,其实际时延效果也绝非完美。多数浏览器实际运行的延时值要稍高于设定值,通常只有几毫秒的偏差。一些浏览器会在间隔计时器中(interval timer)修正偏差。另外须要注意的,在同一页面上设置过多的计时器致使浏览器速度变慢,甚至无响应。三或四个计时器一般是可接受的上限。多线程
setTimeout函数
第一种办法使用Window对象的setTimeout方法。这种方法设置特定毫秒值,而后运行指定代码,代码能够是对函数的直接引用,也能够是做为源代码的字符串。线程
window.setTimeout(referenceToFunction,timeInMilliseconds);window.setTimeout('runMoreCode()',timeInMilliseconds);对象
若有可能,你应该使用直接的函数引用,这样就更有效。使用字符串的话就要求浏览器建立新的脚本环境,以便可以运行脚本。事件
若是你建立计时器,计时器后面的代码会照常运行。在延迟设定时间后(旧线程结束),计时器会启动新线程,setTimeout指定的代码代码会在新线程中运行,而其余代码仍运行在原先的线程中。跟其余复杂的语言相比,JavaScript不提供任何方式来控制线程休眠,唤醒,或是生成。 JavaScript引擎会处理一切,新线程会在当前线程结束后执行。尽管在理论上,多线程脚本引擎能够在老线程运行的同时执行新线程,但 JavaScript引擎是一个单线程的引用程序,只容许在一个线程结束后,开启其余线程。这一规则一样适用于事件(Event),它会在本身的线程中运行,并可随时触发。它会等待当前线程结束,而后才会开启新线程。ip
要给延时计时器传递参数,有两个方式可选。使用字符串,不过须要确保你传递的参数能够用基本的数据类型表示。不要包含任何能够破坏字符串格式的字符(如引号)。若是能够,请避免使用这种方法。不过以防你须要使用这样方法,下面提供了一个例子参考。作用域
window.setTimeout('runMoreCode(''+someString+'','+someNumber+')',10);字符串
直接使用函数要更方便些,由于你能够将变量做为额外的参数传递给setTimeout方法。除了更方便,这种办法也接受任何类型的变量。这一要注意,这种办法在IE中不行。对采用Mozilla Gecko引擎的浏览器要当心(如Firefox和Netscape 6+),由于这些浏览器老是会传输一个额外的参数给函数——毫秒偏差值(number of miliseconds error),下面这个例子使用了内联匿名函数,其等效于使用直接的函数引用。it
window.setTimeout(function (a,b) { //do something with a and b },10,someString,someObject);
传输给函数的变量将是函数调用时变量所保存的值。好比你有一个名为myVar的变量,其保存的数值为5。若是你调用时延函数,将变量myVar传递给它,然并设置1秒的延时值。而后你当即将myVar保存的数值改成7。那么当时延函数运行时,他会运行所时延函数所引用的函数,并将数字5传递给所引用的函数,由于在调用时延函数时,变量myVar保存的值为数字5。
悲剧的是,IE浏览器不能直接给时延函数传递额外的参数,确保兼容性常见的办法就是保证变量处在当前做用域中,以便时延函数直接引用。
setInterval
setInterval 方法在语法上与setTimeout()同样。区别就是它会以一样的时延间隔重复运行,直至取消。
window.setInterval(function (a,b) { //do something with a and b },10,someString,someObject);
清除timeout和interval计时器
你能够调用相应的clearTimeout和clearInterval方法来取消timeout和interval计时器,计时器中的代码就不会运行。在这个例子中,interval 计时器被设置成每一秒就运行一次。而timeout计时器被设置成在3.5秒后取消interval计时器运行。
var myInterval = window.setInterval(function (a,b) { myNumber++; },1000); window.setTimeout(function (a,b) { clearInterval(myInterval); },3500);
获取timeout对象跟获取inteval对象的方法同样,并且你同样也可使用clearTimeout取消timeout计时器。