为什么clearInterval仅第一次调用生效?JS定时器开发问题求助
问题原因
- 作用域错误:你在
triggerTimer函数内部用var声明的myInt属于函数局部变量,仅在triggerTimer内部可访问,removeInt函数运行时读取的是全局作用域下的myInt,该值默认是undefined,传入clearInterval属于无效参数,根本没有成功执行清除逻辑。 - 返回值判断错误:
clearInterval是无返回值的API,无论清除是否成功都会返回undefined,你写的if(clearInterval(myInt))判断条件永远为假,控制台打印fail是必然结果。 - 首次停止属于巧合:首次运行时4秒后计时器数值刚好减到0,进入else分支后不再修改计数,你误以为是
removeInt生效,实际定时器此时还在持续空跑,第二次触发后计数走完时间和4秒错位,就暴露出了清除无效的问题。
解决方案
调整定时器ID的作用域,将myInt提升到全局存储,每次启动新定时器前先清除旧定时器避免叠加,同时移除错误的返回值判断,另外原代码中HTML字符串里的模板字符串语法不会生效,需要替换为普通字符串拼接,修正后的代码如下:
// 全局声明定时器ID变量 var myInt; function triggerTimer() { // 启动新定时器前先清除旧定时器,避免多个定时器同时运行 if(myInt) clearInterval(myInt); myInt = window.setInterval(timerStart, 1000); setTimeout(removeInt, 4000); } function timerStart() { var timerValue = parseInt(document.getElementById('timer').innerHTML); if (timerValue > 0) { timerValue -= 1; document.getElementById('timer').innerHTML = '0' + timerValue.toString(); console.log(timerValue); } else { // 注意:需保证row、multiplechoice变量在当前作用域可访问 var correct = document.getElementById(`c${row}`).innerHTML; multiplechoice.innerHTML = '<p>The correct answer is <span style="color: white;" id="c'+row+'">'+correct+'</span><br><button onclick="submitEntry();">Next Question</button></p>'; // 计数到0后主动清除定时器避免空跑 clearInterval(myInt); myInt = null; } } function removeInt() { clearInterval(myInt); // 清除后重置ID,避免无效值残留 myInt = null; console.log('success'); }
内容的提问来源于stack exchange,提问作者hideme
相关产品推荐
相关产品推荐

