为什么setInterval无法被清除?stopInterval无法终止mave定时器问题
核心原因
- 执行顺序错误+var变量提升特性
你用var声明的mave仅会把声明提升到name函数作用域顶部,赋值操作不会提升。在else if (boy === 'bama')分支中,你先调用了stopInterval(),此时mave还没被赋值为定时器ID,值为undefined,clearInterval(undefined)没有任何实际效果。 - 清除操作执行后才创建定时器
stopInterval()执行完成后,代码才走到var mave = setInterval(...)的步骤,此时定时器才真正启动并把ID赋值给mave,后续没有再触发过清除逻辑,定时器就会一直运行打印g。 - 额外作用域问题
stopInterval是name函数内部定义的函数,全局作用域下无法访问,就算后续想手动调用清除也无法直接执行stopInterval()。
修复示例
调整执行顺序,先创建定时器再执行清除操作即可:
let boy = 'bama'; let count = 1; const name = () => { let stopInterval = () => { if (count >= 1) { clearInterval(mave); } } var mave; if (boy === 'lama') { var move = setInterval(() => { console.log('u'); }, 3000); stopInterval(); } else if (boy === 'bama') { mave = setInterval(() => { console.log('g'); }, 3000); stopInterval(); } }; name();
如果需要后续可以手动控制定时器清除,可以把定时器ID或者清除函数暴露到全局作用域:
let boy = 'bama'; let count = 1; let mave; // 把清除函数提到全局 const stopInterval = () => { if (count >= 1) { clearInterval(mave); } } const name = () => { if (boy === 'lama') { stopInterval(); var move = setInterval(() => { console.log('u'); }, 3000); } else if (boy === 'bama') { mave = setInterval(() => { console.log('g'); }, 3000); } }; name(); // 后续需要清除时直接调用 stopInterval() 即可
内容的提问来源于stack exchange,提问作者cherieodu
相关产品推荐
相关产品推荐

