最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談JavaScript超時(shí)調(diào)用和間歇調(diào)用

 更新時(shí)間:2015年08月30日 16:55:53   投稿:hebedich  
JavaScript是單線程語(yǔ)言,但它允許通過(guò)設(shè)置超時(shí)值和間歇時(shí)間值來(lái)調(diào)度代碼在特定的時(shí)刻執(zhí)行。前者是在指定的時(shí)間過(guò)后執(zhí)行代碼,而后者則是每隔指定的時(shí)間就執(zhí)行一次代碼。

間歇調(diào)用

在JavaScript中間歇調(diào)用很常見(jiàn),setInterval,就是間隔一定的時(shí)間重復(fù)調(diào)用。

setInterval()方法接收兩個(gè)參數(shù):第一個(gè)參數(shù)可以是字符串,也可以是函數(shù),第二個(gè)參數(shù)是一個(gè)以毫秒為單位的數(shù)字,表示重復(fù)間隔的時(shí)長(zhǎng)。

參數(shù)是字符串

當(dāng)?shù)谝粋€(gè)傳遞參數(shù)是字符串時(shí),如下:

setInterval("alert('this is a string.')",1000);

這里的字符串是一段JavaScript代碼,和傳入的eval()函數(shù)的參數(shù)一樣,如果是有內(nèi)外兩個(gè)引號(hào)的話,記得引號(hào)不要相同就行了。

setInterval()會(huì)返回一個(gè)數(shù)值型的ID,這個(gè)ID是計(jì)劃執(zhí)行代碼的唯一標(biāo)識(shí)符,所以可以用它來(lái)取消重復(fù)操作。setInterval()對(duì)應(yīng)的一個(gè)取消該操作的方法:clearInterval(),當(dāng)然要取消重復(fù)操作的話,clearInterval()必須放在還沒(méi)有執(zhí)行完畢的時(shí)候。

比如:

var intervalId=setInterval(...);
clearInterval(intervalId);

首先我們獲取ID,然后將ID傳入clearInterval()中即可,因?yàn)槿∠僮骶o跟在setInterval()后面,所以可以立即取消,就和沒(méi)發(fā)生一樣。

參數(shù)是函數(shù)

因?yàn)楫?dāng)傳遞的參數(shù)是字符串的時(shí)候,可能會(huì)導(dǎo)致性能損失,所以一般情況下,用的最多的還是給它傳遞一個(gè)函數(shù)。

如下:

var num=0;
function increNum(){
 num++;
 if(num>=10){
  clearInterval(intervalId);
  alert('over');
 }
}
intervalId=setInterval(increNum,500);

該段程序設(shè)置了一個(gè)increNum函數(shù),并作為參數(shù)傳遞給setInterval(),同時(shí)當(dāng)重復(fù)運(yùn)行到10次的時(shí)候,取消運(yùn)行操作,彈出警告框。

超時(shí)調(diào)用

超時(shí)調(diào)用和間歇調(diào)用類似,setTimeout(),它也接收兩個(gè)參數(shù),第一個(gè)可以是包含JavaScript代碼的字符串,也可是一個(gè)函數(shù),第二個(gè)參數(shù)是延時(shí)時(shí)間和setInterval()方法的參數(shù)是一樣。

但是這里要說(shuō)明一點(diǎn):

延時(shí)時(shí)間并不是說(shuō)經(jīng)過(guò)設(shè)定的延時(shí)后程序一定會(huì)執(zhí)行。

為什么呢?

因?yàn)镴avaScript是單線程解釋器,所以在一定的時(shí)間內(nèi)只能執(zhí)行一段代碼,不能同時(shí)執(zhí)行多段代碼,所以在JavaScript中有一個(gè)任務(wù)隊(duì)列,將要執(zhí)行的任務(wù)按照先后順序排在隊(duì)列中,設(shè)定的延時(shí)時(shí)間是經(jīng)過(guò)這段時(shí)間將當(dāng)前任務(wù)加入到任務(wù)隊(duì)列中。如果當(dāng)前沒(méi)有任務(wù)執(zhí)行,那么加入到任務(wù)隊(duì)列中的代碼立刻執(zhí)行,如果當(dāng)前還有正在執(zhí)行的代碼段,那么只有當(dāng)該代碼段執(zhí)行完畢后再執(zhí)行新加入的任務(wù)。

同樣,setTimeout()也有一個(gè)返回ID,也可以通過(guò)這個(gè)數(shù)值ID來(lái)取消超時(shí)調(diào)用,對(duì)應(yīng)的取消方法是clearTimeout()。

在這里,我們用超時(shí)調(diào)用方法來(lái)把間歇調(diào)用中的那段重復(fù)執(zhí)行的代碼復(fù)寫一遍:

var num=0;
function increNum(){
 num++;
 if(num<=10){
  setTimeout(increNum,500);
 }else{
  alert('over');
 }
}
setTimeout(increNum,500);

這段程序也可以完成重復(fù)操作并在10次之后終止操作,和上述的setInterval()有區(qū)別的是它并沒(méi)有用返回的數(shù)值ID。

因?yàn)閟etInterval()是重復(fù)執(zhí)行,所以一直會(huì)有數(shù)值ID返回,所以必須得一直跟蹤這個(gè)數(shù)值ID,而setTimeout()執(zhí)行完畢后就不再執(zhí)行,所以我們不用跟蹤這個(gè)返回的數(shù)值ID,這就給我們帶來(lái)了一定的便利。

而且,后一個(gè)間歇調(diào)用可能會(huì)在前一個(gè)間歇調(diào)用還沒(méi)結(jié)束之前被調(diào)用,當(dāng)函數(shù)的執(zhí)行時(shí)間比間歇調(diào)用的時(shí)間長(zhǎng)的時(shí)候這種情況就會(huì)發(fā)生,所以綜上所述,用setTimeout()來(lái)模擬間歇調(diào)用是一種比較好的途徑。

當(dāng)然,在比較簡(jiǎn)單的程序中用setInterval()還是沒(méi)有很大問(wèn)題的(突然想起了一句話,存在即是合理的~~~~)。

相關(guān)文章

最新評(píng)論

鄂温| 偏关县| 玛多县| 疏勒县| 平乡县| 徐汇区| 寿宁县| 闵行区| 定州市| 石泉县| 盐边县| 襄樊市| 文安县| 依安县| 民丰县| 额敏县| 肥乡县| 湄潭县| 望奎县| 榕江县| 宁化县| 河西区| 西平县| 新竹市| 大竹县| 兴隆县| 泰安市| 育儿| 潮州市| 井冈山市| 五家渠市| 辛集市| 五河县| 花莲市| 阆中市| 台中县| 张掖市| 长泰县| 封丘县| 巴南区| 琼结县|