在JavaScript中,有两种方式可以设置时延(time delay)。第一种方式很简单,这种方法会先等待所设定的时长,然后再运行函数代码。第二种也是一样,只是它会重复运行函数代码。
注意,许多浏览器的最小时延值在25到75毫秒之间,一些极速浏览器的最小时延可达3毫秒。如果设置的时延值小于浏览器的最小值,代码运行的实际时延就是就是浏览器的最小时延值。即便设置时延值高于最小值时,其实际时延效果也绝非完美。多数浏览器实际运行的延时值要稍高于设定值,一般只有几毫秒的误差。一些浏览器会在间隔计时器中(interval timer)修正误差。另外需要注意的,在同一页面上设置过多的计时器导致浏览器速度变慢,甚至无响应。三或四个计时器通常是可接受的上限。
setTimeout
第一种办法使用Window对象的setTimeout方法。这种方法设置特定毫秒值,然后运行指定代码,代码可以是对函数的直接引用,也可以是作为源代码的字符串。
window.setTimeout(referenceToFunction,timeInMilliseconds);window.setTimeout('runMoreCode()',timeInMilliseconds);
如有可能,你应该使用直接的函数引用,这样就更有效。使用字符串的话就要求浏览器创建新的脚本环境,以便能够运行脚本。
如果你创建计时器,计时器后面的代码会照常运行。在延迟设定时间后(旧线程结束),计时器会启动新线程,setTimeout指定的代码代码会在新线程中运行,而其他代码仍运行在原先的线程中。跟其他复杂的语言相比,JavaScript不提供任何方式来控制线程休眠,唤醒,或是生成。 JavaScript引擎会处理一切,新线程会在当前线程结束后执行。尽管在理论上,多线程脚本引擎可以在老线程运行的同时执行新线程,但 JavaScript引擎是一个单线程的引用程序,只允许在一个线程结束后,开启其他线程。这一规则同样适用于事件(Event),它会在自己的线程中运行,并可随时触发。它会等待当前线程结束,然后才会开启新线程。
要给延时计时器传递参数,有两个方式可选。使用字符串,不过需要确保你传递的参数可以用基本的数据类型表示。不要包含任何可以破坏字符串格式的字符(如引号)。如果可以,请避免使用这种方法。不过以防你需要使用这样方法,下面提供了一个例子参考。
window.setTimeout('runMoreCode(''+someString+'','+someNumber+')',10);
直接使用函数要更方便些,因为你可以将变量作为额外的参数传递给setTimeout方法。除了更方便,这种办法也接受任何类型的变量。这一要注意,这种办法在IE中不行。对采用Mozilla Gecko引擎的浏览器要小心(如Firefox和Netscape 6+),因为这些浏览器总是会传输一个额外的参数给函数——毫秒误差值(number of miliseconds error),下面这个例子使用了内联匿名函数,其等效于使用直接的函数引用。
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计时器。
分享到:
相关推荐
相对一个时域信号进行时延,找了一下MATLAB自身所在的函数,并没有找到,于是,自己就写了一个,实现对信号时延。
计算无线衰落信道平均时延扩展和均方根时延扩展
本matlab文档进行了LTE系统中对于无线信道的参数均方根时延扩展的具体计算方法,将多径信道中的各路时延与参数rms联系起来。
对于移动通信业务而言,最重要的时延是端到端时延,即对于已经建立连接的收发两端,数据包从发送端产生,到接收端正确接收的时延。
相时延对信号波形影响的讨论,群时延对调幅波包络线影响的讨论
基于时延的声音定位算法的实现方案:设计了以TMS320F2812数字信号处理器为核心的基于互相关时延估计算法的被动声定位系统。 利用该芯片同时具有数字信号处理器和微控制器的特点, 简化了结构设计, 提高了系统的处理...
利用互相关求解时延差,入门程序,仅供参考
95_avg: 按照时延从小到达排序,时延值小的95%时延的平均值 95_std:按照时延从小到达排序,时延值小的95%的stddev值 99_max:按照时延从小到达排序,第95%的时延值,例如1000个请求,把他们的时延值排序,第%95的时延...
详细描述了verilog hdl语句间时延与语句内时延的区别 。
为了进一步优化控制面时延性能,可采用设置NSA的锚点与NR子帧同步、将B1的timetotrigger设置得略小等方案;而采取SR周期自适应方式则可以降低用户面时延。并给出了时延优化方案,给NSA网络部署提供了相应的思路和...
最小均方差(LMS)滤波器时延估计算法的Matlab实现
本文介绍了降低空口时延技术,通过帧结构压缩和基于OFDM符号调度的方法,以及终端自主调度,可以显著降低空口数据传输时延。
在WCDMA系统中,业务质量(QoS)是一个用户和业务提供商都非常关心的话题...而对非实时业务来说,虽然时延对业务质量的影响不大,但对时延分析有助于了解网络整体性能。 因此,对网络进行时延预算分析是非常有必要的。
时延优化案例.docx时延优化案例.docx时延优化案例.docx时延优化案例.docx时延优化案例.docx时延优化案例.docx
用MUSIC算法实现多径信号的时域时延估计
使用matlab 实现广义互相关算法,得到时延求解
基于matlab的时延估计算法的互相关函数仿真源代码
准确的时延估计(Time Delay Estimation,TDE)是基于到达时间差(Time Difference of Arrival,TDOA)的声源定位技术的前提.在众多时延估计算法中,广义互相关(Generalized Cross Correlation,GCC)算法因其较低...
服务质量(QoS)是下一代网络(NGN)业务能否取得成功的一个重要因素,影响用户业务体验的QoS参数通常包括时延、抖动、丢包率等,而对于实时的语音和视频业务来说,业务数据的端到端时延最为关键。在以IP作为承载的NGN中...
该程序为小数时延滤波器matlab程序,实现小数倍采样周期时延,可以应用在许多场合,如语音处理、测距定位等。