JavaScript是单线程语言,但它容许经过设置超时值和间歇时间值来调度代码在特定的时刻执行。前者是在指定的时间事后执行代码,然后者是每隔指定的时间就执行一次代码。函数
超时调用须要使用window对象的setTimeout()
方法,它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前须要等待多少秒)。第一个参数能够是一个包含JavaScript代码的字符串,也能够是一个函数,可是因为传递字符串可能致使性能损失,所以不建议以字符串做为第一个参数。
下面是重点哦!!!!
第二个参数是一个表示等待多长时间的毫秒数,但通过该时间后指定的代码不必定会执行。JavaScript是一个单线程的解释器,所以必定时间内只能执行一段代码。为了控制要执行的代码,就有一个JavaScript任务队列。这些任务会按照将它们添加到队列的顺序执行。setTimeout()
的第二个参数告诉JavaScript再过多长时间把当前任务添加到队列中。若是队列是空的,那么添加的代码会当即执行;若是队列不是空的,那么它就要等前面的代码执行完了后再执行。
调用setTimeout()
以后,该方法会返回一直数值ID,表示超时调用。这个超时调用ID是计划执行代码的惟一标识符,能够经过它来取消超时调用。要取消还没有执行的超时调用计划,能够调用clearTimeout()
方法并将相应的超市调用ID做为参数传递给它。如:性能
// 设置超时调用 var timeoutId = setTimeout(function(){ alert("Hello World!"); },100); // 取消超时调用 clearTimeout(timeoutId);
只要在指定的时间还没有过去以前调用clearTimeout()
,就能够彻底取消超时调用。前面的代码在设置超时调用后立刻又调用了clearTimeout()
,结果就跟什么也没有发生同样。
注:超时调用的代码都是在全局做用域中执行的,所以函数中this的值在非严格模式下指向window对象,严格模式下是undefined。this
间歇调用与超时调用相似,只不过它会按照指定的时间间隔重复执行代码,直至间歇调用被取消或者页面被卸载。线程
在使用超时调用时,没有必要跟踪超时调用ID,由于每次执行代码以后,若是再也不设置另外一次超时调用,调用就会自行中止。通常认为,使用超时调用来模拟间歇调用的是一种最佳模式。在开发环境下,不多使用真正的间歇调用,缘由是后一个间歇调用可能会在前一个间歇调用结束前启动。
使用超时调用则能够彻底避免这一点。以下:code
var num = 0; var max = 10; function incrementNumber () { num++; if (num < max) { setTimeout(incrementNumber,500); } else { alert("Done"); } } setTimeout(incrementNumber,500);