JavaScript是單線程語(yǔ)言,但它允許通過(guò)設(shè)置超時(shí)值和間歇時(shí)間值來(lái)調(diào)度代碼在特定的時(shí)刻執(zhí)行。前者是在指定的時(shí)間過(guò)后執(zhí)行代碼,而后者則是每隔指定的時(shí)間就執(zhí)行一次代碼。
超時(shí)調(diào)用需要使用window對(duì)象的setTimeout()方法,它接受兩個(gè)參數(shù):要執(zhí)行的代碼和以毫秒表示的時(shí)間(即在執(zhí)行代碼前需要等待多少毫秒)。其中,第一個(gè)參數(shù)可以是一個(gè)包含JavaScript代碼的字符串(就和在eval()函數(shù)中使用的字符串一樣),也可以是一個(gè)函數(shù)。例如,下面對(duì)
setTimeout()的兩次調(diào)用都會(huì)在一秒鐘后顯示一個(gè)警告框:
//不建議傳遞字符串!
setTimeout('alert(’Hello worldl’) “, 1000);
//推薦的調(diào)用方式
setTimeout( function() {
alert( "Hello world!");
}, 1000);
雖然這兩種調(diào)用方式都沒(méi)有問(wèn)題,但由于傳遞字符串可能導(dǎo)致性能損失,因此南昌網(wǎng)站建設(shè)公司工程師不建議以字符串作為第一個(gè)參數(shù)。
調(diào)用setTimeout()之后,該方法會(huì)返回一個(gè)數(shù)值ID,表示超時(shí)調(diào)用。這個(gè)超時(shí)調(diào)用ID是計(jì)劃執(zhí)行代碼的唯一標(biāo)識(shí)符,可以通過(guò)它來(lái)取消超時(shí)調(diào)用。要取消尚未執(zhí)行的超時(shí)調(diào)用計(jì)劃,可以調(diào)用clearTimeout()方法并將相應(yīng)的超時(shí)調(diào)用ID作為參數(shù)傳遞給它,如下所示:
//設(shè)置超時(shí)調(diào)用
var timeoutld=setTimeout( fune tion() (
alert( "Hello world!");
), lOOO) ;
//注意:把它取消
clearTimeout(timeoutld);
只要是在指定的時(shí)間尚未過(guò)去之前調(diào)用clearTimeout(),就可以完全取消超時(shí)調(diào)用。前面的代碼在設(shè)置超時(shí)調(diào)用之后馬上又調(diào)用了clearTimeout(),結(jié)果就跟什么也沒(méi)有發(fā)生一樣。
超時(shí)調(diào)用的代碼都是在全局作用域中執(zhí)行的,因此函數(shù)中this的值通常會(huì)指向window對(duì)象。
間歇調(diào)用與超時(shí)調(diào)用類似,只不過(guò)它會(huì)按照指定的時(shí)間間隔重復(fù)執(zhí)行代碼,直至間歇調(diào)用被取消或者頁(yè)面被卸載。設(shè)置間歇調(diào)用的方法是setlnterval(),它接受的參數(shù)與setTimeout()相同:要執(zhí)行的代碼(字符串或函數(shù))和每次執(zhí)行之前需要等待的毫秒數(shù)。下面來(lái)看一個(gè)例子:
//不建議傳遞字符串!
setlnterval ("alert('Hello world!') 0);
//推薦的調(diào)用方式
setlnterval( function() {’
alert( "Hello worldl");
}, 10000);
調(diào)用setlnterval()方法同樣也會(huì)返回一個(gè)間歇調(diào)用ID,該ID可用于在將來(lái)某個(gè)時(shí)刻取消間歇調(diào)用。要取消尚未執(zhí)行的間歇調(diào)用,可以使用clearlnterval()方法并傳人相應(yīng)的間歇調(diào)用ID。取消間歇調(diào)用的重要性要遠(yuǎn)遠(yuǎn)高于取消超時(shí)調(diào)用,南昌網(wǎng)站設(shè)計(jì)公司技術(shù)人員認(rèn)為在不加干涉的情況下,間歇調(diào)用將會(huì)一直執(zhí)行到頁(yè)面卸載。以下是一個(gè)常見(jiàn)的使用間歇調(diào)用的例子:
var num=O:
var max=10;
var intervalld=null;
function incrementNumber() {
num++:
//如果執(zhí)行次數(shù)達(dá)到了max設(shè)定的值,則取消后續(xù)尚未執(zhí)行的調(diào)用
if (num==max) {
clearlnterval(intervalld);
alert("Done");
}
}
intervalld=setlnterval( incrementNurnber, 500)j
在這個(gè)例子中,變量mun每半秒鐘遞增一次,當(dāng)遞增到最大值時(shí)就會(huì)取消先前設(shè)定的間歇調(diào)用。這個(gè)模式也可以使用超時(shí)調(diào)用來(lái)實(shí)現(xiàn),如下所示:
var num=O:
var max=10;
function incrementNumber() {
num++:
}
可見(jiàn),在使用超時(shí)調(diào)用時(shí),沒(méi)有必要跟蹤超時(shí)調(diào)用ID,因?yàn)槊看螆?zhí)行代碼之后,如果不再設(shè)置另一次超時(shí)調(diào)用,調(diào)用就會(huì)自行停止。一般認(rèn)為,使用超時(shí)調(diào)用來(lái)模擬間歇調(diào)用的是一種最佳模式。南昌網(wǎng)絡(luò)公司技術(shù)人員認(rèn)為在開發(fā)環(huán)境下,很少使用真正的間歇調(diào)用,原因是后一個(gè)間歇調(diào)用可能會(huì)在前一個(gè)間歇調(diào)用結(jié)束之前啟動(dòng),而像前面示例中那樣使用超時(shí)調(diào)用,則完全可以避免這一點(diǎn)。所以,最好不要使用間歇調(diào)用。
本文僅限內(nèi)部技術(shù)人員學(xué)習(xí)交流,不得作于其他商業(yè)用途.文章出自:南昌網(wǎng)站制作公司-百恒網(wǎng)絡(luò) http://www.myforexfactory.net 如轉(zhuǎn)載請(qǐng)注明出處!