淺談JavaScript超時(shí)調(diào)用和間歇調(diào)用
間歇調(diào)用
在JavaScript中間歇調(diào)用很常見,setInterval,就是間隔一定的時(shí)間重復(fù)調(diào)用。
setInterval()方法接收兩個(gè)參數(shù):第一個(gè)參數(shù)可以是字符串,也可以是函數(shù),第二個(gè)參數(shù)是一個(gè)以毫秒為單位的數(shù)字,表示重復(fù)間隔的時(shí)長。
參數(shù)是字符串
當(dāng)?shù)谝粋€(gè)傳遞參數(shù)是字符串時(shí),如下:
setInterval("alert('this is a string.')",1000);
這里的字符串是一段JavaScript代碼,和傳入的eval()函數(shù)的參數(shù)一樣,如果是有內(nèi)外兩個(gè)引號的話,記得引號不要相同就行了。
setInterval()會返回一個(gè)數(shù)值型的ID,這個(gè)ID是計(jì)劃執(zhí)行代碼的唯一標(biāo)識符,所以可以用它來取消重復(fù)操作。setInterval()對應(yīng)的一個(gè)取消該操作的方法:clearInterval(),當(dāng)然要取消重復(fù)操作的話,clearInterval()必須放在還沒有執(zhí)行完畢的時(shí)候。
比如:
var intervalId=setInterval(...); clearInterval(intervalId);
首先我們獲取ID,然后將ID傳入clearInterval()中即可,因?yàn)槿∠僮骶o跟在setInterval()后面,所以可以立即取消,就和沒發(fā)生一樣。
參數(shù)是函數(shù)
因?yàn)楫?dāng)傳遞的參數(shù)是字符串的時(shí)候,可能會導(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ù)是一樣。
但是這里要說明一點(diǎn):
延時(shí)時(shí)間并不是說經(jīng)過設(shè)定的延時(shí)后程序一定會執(zhí)行。
為什么呢?
因?yàn)镴avaScript是單線程解釋器,所以在一定的時(shí)間內(nèi)只能執(zhí)行一段代碼,不能同時(shí)執(zhí)行多段代碼,所以在JavaScript中有一個(gè)任務(wù)隊(duì)列,將要執(zhí)行的任務(wù)按照先后順序排在隊(duì)列中,設(shè)定的延時(shí)時(shí)間是經(jīng)過這段時(shí)間將當(dāng)前任務(wù)加入到任務(wù)隊(duì)列中。如果當(dāng)前沒有任務(wù)執(zhí)行,那么加入到任務(wù)隊(duì)列中的代碼立刻執(zhí)行,如果當(dāng)前還有正在執(zhí)行的代碼段,那么只有當(dāng)該代碼段執(zhí)行完畢后再執(zhí)行新加入的任務(wù)。
同樣,setTimeout()也有一個(gè)返回ID,也可以通過這個(gè)數(shù)值ID來取消超時(shí)調(diào)用,對應(yīng)的取消方法是clearTimeout()。
在這里,我們用超時(shí)調(diào)用方法來把間歇調(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ū)別的是它并沒有用返回的數(shù)值ID。
因?yàn)閟etInterval()是重復(fù)執(zhí)行,所以一直會有數(shù)值ID返回,所以必須得一直跟蹤這個(gè)數(shù)值ID,而setTimeout()執(zhí)行完畢后就不再執(zhí)行,所以我們不用跟蹤這個(gè)返回的數(shù)值ID,這就給我們帶來了一定的便利。
而且,后一個(gè)間歇調(diào)用可能會在前一個(gè)間歇調(diào)用還沒結(jié)束之前被調(diào)用,當(dāng)函數(shù)的執(zhí)行時(shí)間比間歇調(diào)用的時(shí)間長的時(shí)候這種情況就會發(fā)生,所以綜上所述,用setTimeout()來模擬間歇調(diào)用是一種比較好的途徑。
當(dāng)然,在比較簡單的程序中用setInterval()還是沒有很大問題的(突然想起了一句話,存在即是合理的~~~~)。
相關(guān)文章
JavaScript中的undefined學(xué)習(xí)總結(jié)
這篇文章主要是對JavaScript中的undefined進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11JavaScript簡單遍歷DOM對象所有屬性的實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript簡單遍歷DOM對象所有屬性的實(shí)現(xiàn)方法,涉及JavaScript針對頁面元素屬性操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10js 下拉菜單點(diǎn)擊旁邊收起實(shí)現(xiàn)(踩坑記)
這篇文章主要介紹了js 下拉菜單點(diǎn)擊旁邊收起實(shí)現(xiàn)(踩坑記),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09uniapp使用uni-imei插件獲取手機(jī)的設(shè)備號
uniapp框架是一款開發(fā)跨平臺應(yīng)用的工具,它支持iOS、Android以及Web等多個(gè)平臺,在這些平臺中,uniapp可以訪問某些設(shè)備的硬件信息,這篇文章主要給大家介紹了關(guān)于uniapp使用uni-imei插件獲取手機(jī)設(shè)備號的相關(guān)資料,需要的朋友可以參考下2024-01-01JavaScript中兩種鏈?zhǔn)秸{(diào)用實(shí)現(xiàn)代碼
方法鏈一般適合對一個(gè)對象進(jìn)行連續(xù)操作(集中在一句代碼)。一定程度上可以減少代碼量,缺點(diǎn)是它占用了函數(shù)的返回值。2011-01-01js實(shí)現(xiàn)的標(biāo)題欄新消息閃爍提示效果
這篇文章主要介紹了js實(shí)現(xiàn)的標(biāo)題欄新消息閃爍提示效果,一些大型網(wǎng)站也會經(jīng)常用到這個(gè)效果,需要的朋友可以參考下2014-06-06一個(gè)不錯(cuò)的字符串轉(zhuǎn)碼解碼函數(shù)(自寫)
一個(gè)不錯(cuò)的字符串轉(zhuǎn)碼解碼函數(shù),自己寫的,有需要的朋友可以參考下2014-07-07