間歇呼叫
在JavaScript中間歇呼叫很常見,setInterval,就是間隔一定的時間重複呼叫。
setInterval()方法接收兩個參數:第一個參數可以是字串,也可以是函數,第二個參數是一個以毫秒為單位的數字,表示重複間隔的時長。
參數是字串
當第一個傳遞參數是字串時,如下:
setInterval("alert('this is a string.')",1000);
這裡的字串是一段JavaScript程式碼,跟傳入的eval()函數的參數一樣,如果是有內外兩個引號的話,記得引號不要相同就行了。
setInterval()會回傳一個數值型的ID,這個ID是計畫執行程式碼的唯一標識符,所以可以用它來取消重複操作。 setInterval()對應的一個取消該操作的方法:clearInterval(),當然要取消重複操作的話,clearInterval()必須放在還沒執行完畢的時候。
例如:
var intervalId=setInterval(...); clearInterval(intervalId);
首先我們取得ID,然後將ID傳入clearInterval()即可,因為取消作業緊接在setInterval()後面,所以可以立即取消,就跟沒發生一樣。
參數是函數
因為當傳遞的參數是字串的時候,可能會導致效能損失,所以一般情況下,用的最多的還是給它傳遞一個函數。
如下:
var num=0; function increNum(){ num++; if(num>=10){ clearInterval(intervalId); alert('over'); } } intervalId=setInterval(increNum,500);
該段程式設定了一個increNum函數,並作為參數傳遞給setInterval(),同時當重複運行到10次的時候,取消運行操作,彈出警告框。
超時呼叫
逾時呼叫和間歇呼叫類似,setTimeout(),它也接收兩個參數,第一個可以是包含JavaScript程式碼的字串,也可是一個函數,第二個參數是延遲時間和setInterval()方法的參數是一樣。
但這裡要說明一點:
延時時間並不是說經過設定的延時後程式一定會執行。
為什麼呢?
因為JavaScript是單執行緒解釋器,所以在一定的時間內只能執行一段程式碼,不能同時執行多段程式碼,所以在JavaScript中有一個任務佇列,將要執行的任務按照先後順序排在佇列中,設定的延時時間是經過這段時間將目前任務加入任務佇列。如果目前沒有任務執行,那麼加入到任務佇列中的程式碼立刻執行,如果目前還有正在執行的程式碼段,那麼只有當該程式碼段執行完畢後再執行新加入的任務。
同樣,setTimeout()也有一個返回ID,也可以透過這個數值ID來取消逾時調用,對應的取消方法是clearTimeout()。
在這裡,我們用超時呼叫方法來把間歇呼叫中的那段重複執行的程式碼複寫一遍:
var num=0; function increNum(){ num++; if(num<=10){ setTimeout(increNum,500); }else{ alert('over'); } } setTimeout(increNum,500);
這段程式也可以完成重複操作並在10次之後終止操作,和上述的setInterval()有區別的是它並沒有用傳回的數值ID。
因為setInterval()是重複執行,所以一直會有數值ID返回,所以必須得一直追蹤這個數值ID,而setTimeout()執行完畢後就不再執行,所以我們不用追蹤這個返回的數值ID,這就為我們帶來了一定的便利。
而且,後一個間歇調用可能會在前一個間歇調用還沒結束之前被調用,當函數的執行時間比間歇調用的時間長的時候這種情況就會發生,所以綜上所述,用setTimeout()來模擬間歇呼叫是一種比較好的途徑。
當然,在比較簡單的程序中用setInterval()還是沒有很大問題的(突然想起了一句話,存在即是合理的~~~~)。