使用 `settimeout` 无法持续触发定时逻辑,应改用 `setinterval` 配合时间戳计算实现稳定运行的秒表功能,同时注意变量作用域、时间单位换算及资源清理。
在 JavaScript 中实现一个高精度的毫秒级计时器(如秒表),关键在于持续、稳定地获取经过的时间,而非依赖单次或递归调用 setTimeout。原代码中存在多个核心问题:
✅ 正确做法是:
以下是优化后的完整实现:
Seconds: 0 Milliseconds: 0
let intervalTimer = null;
let startTime = 0;
let elapsed = 0;
document.getElementById("start_button").addEventListener('click', () => {
if (!intervalTimer) {
startTime = Date.now(); // 更简洁高效的时间戳获取方式
intervalTimer = setInterval(() => {
elapsed = Date.now() - startTime;
const seconds = Math.floor(elapsed / 1000);
const milliseconds = elapsed % 1000;
document.getElementById("seconds").textContent = seconds;
document.getElementById("milli_seconds").textContent = elapsed; // 或 milliseconds,按需显示
}, 1); // 每毫秒更新(实际精度受浏览器限制,通常 ≥4ms)
}
});
document.getElementById("stop_button").addEventListener('click', () => {
if (intervalTimer) {
clearInterval(intervalTimer);
intervalTimer = null;
}
});⚠️ 注意事项:
ervalTimer 是否已存在,避免重复启动; 通过以上结构,你将获得一个响应及时、逻辑清晰、可维护性强的 JavaScript 秒表计时器。