一、setInterval简介
setInterval是Javascript中的一个函数,用于在指定的时间间隔内重复执行某个函数或代码块。
setInterval(() => { console.log("Hello World!"); }, 1000); //每隔1秒执行一次console.log("Hello World!");
二、手动停止setInterval
1. 使用clearInterval
为了手动停止setInterval,Javascript提供了clearInterval函数,该函数可以传入setInterval返回的ID值,从而停止该定时器。
let timerId = setInterval(() => { console.log("Hello World!"); }, 1000); // 3秒后停止执行 setTimeout(() => { clearInterval(timerId); }, 3000)
上面代码中,声明了一个timerId变量来存储setInterval的返回值,即定时器的ID。通过setTimeout函数,3秒后手动停止setInterval的执行。
2. 如果忘记保存定时器ID
如果忘记保存定时器ID,如何停止setInterval的执行呢?答案是使用匿名函数。
//不保存定时器ID setInterval(() => { console.log("Hello World!"); }, 1000); // 3秒后停止执行 setTimeout(() => { clearInterval(window.setInterval(function(){})); }, 3000);
注意,因为要停止匿名函数内的setInterval,需要在clearInterval中传入一个空匿名函数。
三、自动停止setInterval
1. 循环次数
可以通过记录循环次数,达到一定次数后自动停止setInterval的执行。需要注意的是,定时器中执行代码块的执行时间可能不固定,因此需要在执行前记录下时间,比较当前时间和开始时间的间隔是否达到预设值。
let count = 0; let startTime = new Date(); //每隔1秒执行1次,当count达到3时停止执行 let timerId = setInterval(() => { count++; let nowTime = new Date(); if (count >= 3 || nowTime - startTime >= 5000) { clearInterval(timerId); } console.log("Hello World!"); }, 1000);
2. 预设时间
除了记录循环次数,也可以通过预设时间来自动停止setInterval的执行。同样需要在定时器内部记录开始时间和当前时间的间隔。
let startTime = new Date(); //5秒后停止执行 let timerId = setInterval(() => { let nowTime = new Date(); if (nowTime - startTime >= 5000) { clearInterval(timerId); } console.log("Hello World!"); }, 1000);
四、避免setInterval的内存泄漏
setInterval作为一种频繁调用的定时器,容易造成内存泄漏。因此在停止setInterval时,要特别注意定时器是否被清除。
let timerId = setInterval(() => { console.log("Hello World!"); }, 1000); // 3秒后停止执行 setTimeout(() => { clearInterval(timerId); timerId = null; }, 3000)
上面代码中,手动清除setInterval后,将timerId设置为null,以确保内存正常回收。