JavaScript中setInterval()用法舉例詳解
1 基本語法
setInterval() 是 JavaScript 中的一個(gè)內(nèi)置函數(shù),它用于在指定的間隔時(shí)間內(nèi)重復(fù)執(zhí)行一段代碼,實(shí)現(xiàn)周期性操作。該函數(shù)的語法如下:
setInterval(function, milliseconds, param1, param2, ...)
2 參數(shù)說明
function:必需,要重復(fù)執(zhí)行的函數(shù)或代碼塊。milliseconds:必需,重復(fù)執(zhí)行的時(shí)間間隔(以毫秒為單位)。param1, param2, ...:可選,傳遞給要執(zhí)行的函數(shù)的參數(shù)。如果無須傳遞參數(shù),則省略此參數(shù)。
注意:
如果 setInterval() 函數(shù)的第一個(gè)參數(shù)是一個(gè)函數(shù),那么該函數(shù)會在每個(gè)時(shí)間間隔后被調(diào)用,直到計(jì)時(shí)器被取消。
如果 setInterval() 函數(shù)的第一個(gè)參數(shù)是一個(gè)字符串,那么該字符串會被解釋為一段要執(zhí)行的 JavaScript 代碼。這種用法已經(jīng)被棄用,不建議使用。
如果 setInterval() 函數(shù)的時(shí)間間隔設(shè)為 0 或負(fù)數(shù),那么該函數(shù)會立即執(zhí)行第一個(gè)參數(shù)所表示的函數(shù)或代碼,并且不會周期性地執(zhí)行。
如果 setInterval() 函數(shù)的時(shí)間間隔設(shè)為較小的值,那么可能會因?yàn)闉g覽器的性能限制而導(dǎo)致定時(shí)器不準(zhǔn)確。建議將時(shí)間間隔設(shè)為 100 毫秒或以上,以保證計(jì)時(shí)器的準(zhǔn)確性。
3 使用示例
使用匿名函數(shù)作為第一個(gè)參數(shù),用來輸出當(dāng)前時(shí)間,間隔時(shí)間是1000毫秒即1秒鐘。
// 每秒鐘輸出一次當(dāng)前時(shí)間
setInterval(function() {
console.log(new Date().toLocaleTimeString());
}, 1000);4 停止 setInterval() 方法
setInterval() 方法會返回一個(gè)計(jì)時(shí)器ID,可以通過該計(jì)時(shí)器ID來取消計(jì)時(shí)器的執(zhí)行,方法如下:
intervalId = setInterval(function() {
console.log(new Date().toLocaleTimeString());
}, 1000);
clearInterval(intervalId );其中,intervalId 是一個(gè)變量,用于保存 setInterval() 方法返回的計(jì)時(shí)器對象ID。調(diào)用 clearInterval() 方法后,就可以取消計(jì)時(shí)器的執(zhí)行。
示例: 打印5次后,取消計(jì)時(shí)器的執(zhí)行。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var counter = 0;
maxNum = 5;
function myFunc() {
var date = new Date();
console.log(date.toLocaleTimeString());
counter++;
if (counter == maxNum) {
clearInterval(intervalId);
console.log('已打印' + maxNum + "次");
}
}
var intervalId = setInterval(myFunc, 1000);
</script>
</body>
</html>打印結(jié)果:

附:JavaScript定時(shí)器setInterval如何做到在定義時(shí)先執(zhí)行一遍
JavaScript中的定時(shí)器setInterval是計(jì)時(shí)到才會開始執(zhí)行,有沒有辦法再定義的時(shí)候就先調(diào)用一遍,然后再定時(shí)執(zhí)行呢?
有,只要定義一個(gè)返回“定時(shí)執(zhí)行函數(shù)”(如“waitUploadThenSave”)的“執(zhí)行過程”, 將“定時(shí)執(zhí)行函數(shù)”保存并調(diào)用一次,并且執(zhí)行過程中返回該“定時(shí)執(zhí)行函數(shù)”,將該“執(zhí)行過程”的主體作為定時(shí)器要定時(shí)執(zhí)行的function即可。可參考以下代碼理解:
var count = 0;
var bNoNeedTimerRun = false;
var id = setInterval(
(function () {
var waitUploadThenSave = function () {
//等待上傳執(zhí)行完成后保存數(shù)據(jù):
if (pThis.fileList.every(x => x.status == 'success')) {
clearInterval(id);
if (bNoNeedTimerRun) {
//初始運(yùn)行時(shí)就檢測到都已上傳完成,則定時(shí)運(yùn)行中無須做任何事情,清除定時(shí)器即可
return;
}
if (!id) {
//初始運(yùn)行時(shí)未完成id賦值,此時(shí)就檢測到都已上傳完成,則無需再定時(shí)檢測運(yùn)行
bNoNeedTimerRun = true;
}
setTimeout(() => pThis.saveTaskInfo(), 20); //wait for running on-success callback for upload
return;
} else {
if (++count > 600) {
clearInterval(id);
pThis.$message({
message: `上傳資料${pThis.task.TaskText ? "“" + pThis.task.TaskText + "”" : ""}執(zhí)行超時(shí),未執(zhí)行保存!`,
type: 'error'
});
}
}
}
waitUploadThenSave();
return waitUploadThenSave;
})()
, 50);封裝
每次都寫這么多是不是既麻煩又啰嗦,代碼還不簡潔,于是我封裝了如下“timerCheckRun”方法,用的時(shí)候只需傳入“條件、滿足條件時(shí)執(zhí)行的方法、超時(shí)提示” 參數(shù)即可:
//定時(shí)判斷執(zhí)行:
timerCheckRun: function (checkCondition, trueAction, timeOutAction, initRun = true, interval = 50, times = 600) {
var iCount = 0;
var bDoAtInit = false;
var timerId = setInterval((function () {
var fn = function () {
if (bDoAtInit) {
clearInterval(timerId);
return; //初始運(yùn)行時(shí)就已滿足條件并執(zhí)行,則無須開啟定時(shí)器,關(guān)閉定時(shí)器即可,無須重復(fù)執(zhí)行
}
if (checkCondition()) {
clearInterval(timerId);
if (initRun) {
if (!timerId) {
bDoAtInit = true; //初始運(yùn)行時(shí)未完成timerId賦值,此時(shí)如果已滿足條件,則做好標(biāo)記,定時(shí)器中關(guān)閉定時(shí)執(zhí)行即可
}
}
trueAction();
} else {
if (++iCount > times) {
clearInterval(timerId);
timeOutAction();
}
}
};
if (initRun) {
fn();
}
return fn;
})(), interval);
}調(diào)用實(shí)例:
$JVue.timerCheckRun(
() => _self.fileList.every(x => x.status == 'success') && (_self.cert.AttachFileIDsArray || []).length - (_self.cert.PendingDeleteAttachFileIDsArray || []).length == _self.fileList.length,
() => _self.saveCertInfo(),
() => _self.$message({
message: '上傳資質(zhì)附件超時(shí),未執(zhí)行保存!',
type: 'error'
})
);總結(jié)
到此這篇關(guān)于JavaScript中setInterval()用法舉例詳解的文章就介紹到這了,更多相關(guān)JS中setInterval()用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS倒計(jì)時(shí)實(shí)例_天時(shí)分秒
下面小編就為大家?guī)硪黄狫S倒計(jì)時(shí)實(shí)例_天時(shí)分秒。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
JavaScript實(shí)現(xiàn)向右伸出的多級網(wǎng)頁菜單效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)向右伸出的多級網(wǎng)頁菜單效果,通過javascript調(diào)用頁面元素屬性的動態(tài)改變實(shí)現(xiàn)向右展開菜單效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
js實(shí)現(xiàn)人民幣大寫金額形式轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)人民幣大寫金額形式轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2016-04-04
小程序接口的promise化的實(shí)現(xiàn)方法
這篇文章主要介紹了小程序接口的promise化的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
js扁平數(shù)組和樹結(jié)構(gòu)相互轉(zhuǎn)換處理方法
這篇文章主要給大家介紹了關(guān)于js扁平數(shù)組和樹結(jié)構(gòu)相互轉(zhuǎn)換處理方法的相關(guān)資料,之前面試有遇到過這個(gè)問題,面試官問如何把一個(gè)數(shù)組數(shù)據(jù)扁平,然后轉(zhuǎn)化為Tree結(jié)構(gòu)數(shù)據(jù),工作中剛好也用到了,所以總結(jié)下,需要的朋友可以參考下2023-07-07
JavaScript之map reduce_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了JavaScript之map reduce的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

