JS使用setInterval时clearInterval报tickerInterval未定义如何解决
问题原因
- 直接报错的根源是变量作用域访问限制:
tickerInterval是在keyup事件的回调函数内部通过var声明的,属于该回调函数的局部变量,定义在全局作用域的clock_ticker函数没有权限访问这个变量,因此执行clearInterval(tickerInterval)时会抛出变量未定义的错误。 - 代码还存在易被忽略的逻辑缺陷:每触发一次键盘弹起事件,就会新建一个间隔定时器,多次触发后会有多个定时器同时运行,不仅会让计时速度异常变快,也无法通过单个ID清除所有运行中的定时器,逻辑完全混乱。
修复方法
将tickerInterval的声明提升到两个函数的共同外层作用域,同时在启动新定时器前先清除已存在的旧定时器,避免多实例叠加,参考代码如下:
var timer = 15; // 定时器ID声明提升到公共作用域,供所有相关函数访问 var tickerInterval = null; $("body").on("keyup", function(event) { // 启动新定时器前先清除旧定时器,防止多定时器叠加运行 if (tickerInterval) { clearInterval(tickerInterval); } // 可根据业务需求选择是否在每次按键后重置倒计时时长 timer = 15; tickerInterval = setInterval(clock_ticker, 1000); }); function clock_ticker() { timer--; // 原有业务逻辑 console.log(timer); if (timer == 0) { clearInterval(tickerInterval); // 清除后重置ID状态,方便下次触发时判断 tickerInterval = null; } }
内容的提问来源于stack exchange,提问作者Real Noob
相关产品推荐
相关产品推荐

