JS定时器是JavaScript提供的用于实现延迟执行或周期性执行代码的功能,主要分为setTimeout和setInterval两种类型,二者在使用场景和特性上存在明显差异,开发者需要根据实际需求选择合适的定时器类型。

setTimeout的使用方法
setTimeout用于在指定的延迟时间后执行一次回调函数,语法格式为setTimeout(callback, delay, ...args),其中callback是要执行的函数,delay是延迟的毫秒数,后面的参数是传递给callback的可选参数。该方法会返回一个定时器ID,用于后续清除定时器。
下面是一个简单的setTimeout使用示例,延迟2秒后在控制台输出提示信息:
// 定义延迟执行的函数
function showMessage(name) {
console.log('延迟2秒后执行,参数是:' + name);
}
// 设置定时器,延迟2000毫秒执行,传递参数给回调函数
const timerId = setTimeout(showMessage, 2000, '测试参数');
console.log('定时器已设置,ID为:' + timerId);
setInterval的使用方法
setInterval用于每隔指定的时间间隔重复执行回调函数,语法格式为setInterval(callback, interval, ...args),参数含义和setTimeout类似,interval是两次执行之间的间隔时间,单位同样是毫秒。该方法也会返回定时器ID,需要注意的是如果不主动清除,setInterval会一直重复执行。
下面示例实现每隔1秒输出一次当前时间,执行5次后自动停止:
let count = 0;
// 每隔1000毫秒执行一次回调函数
const intervalId = setInterval(() => {
const now = new Date();
console.log('第' + (count + 1) + '次执行,当前时间:' + now.toLocaleTimeString());
count++;
// 执行5次后清除定时器
if (count >= 5) {
clearInterval(intervalId);
console.log('定时器已清除');
}
}, 1000);
清除定时器的方法
为了避免定时器不必要的执行造成内存泄漏或逻辑错误,需要在不需要定时器的时候主动清除。清除setTimeout对应的定时器使用clearTimeout(timerId),清除setInterval对应的定时器使用clearInterval(timerId),传入的timerId是创建定时器时返回的唯一标识。
下面示例展示如何主动清除setTimeout定时器:
const timerId = setTimeout(() => {
console.log('这条信息不会输出');
}, 3000);
// 在定时器执行前清除它
clearTimeout(timerId);
console.log('定时器已被清除,不会执行回调');
定时器的执行机制与注意事项
JS是单线程语言,定时器属于宏任务,其回调函数的执行需要等待当前执行栈中的同步任务执行完成,因此实际执行时间可能会比设置的延迟时间更长。另外,setInterval的两次执行之间不会等待上一次回调执行完成,如果回调执行时间超过间隔时间,可能会出现回调连续执行的情况,这种场景下更推荐使用setTimeout递归调用来实现周期性任务。
使用setTimeout递归实现周期性任务的示例:
function loopTask() {
console.log('递归定时器执行,时间:' + new Date().toLocaleTimeString());
// 执行完当前任务后,再设置下一个延迟执行
setTimeout(loopTask, 1000);
}
// 启动递归定时器
setTimeout(loopTask, 1000);
常见问题说明
- 定时器的延迟时间不是绝对精确的,会受到JS事件循环和当前任务执行耗时的影响。
- 页面切换到后台时,部分浏览器会降低定时器的执行频率,甚至暂停setInterval的执行。
- 清除定时器时传入的ID必须是对应定时器返回的ID,否则无法正确清除。
- 定时器回调函数中的this指向默认是全局对象,在严格模式下是undefined,如需绑定this可以使用箭头函数或者bind方法。
setTimeoutsetIntervalclearTimeoutclearIntervalJavaScript_定时器修改时间:2026-07-16 10:42:23