如何暴露startTempMonit返回的Interval以在点击停止按钮时清除定时器
原代码失效原因
const声明的变量必须在声明时完成初始化,且不允许后续重新赋值,你在ready作用域内声明const inter;本身就属于语法错误,后续启动按钮点击事件中给inter赋值的操作会直接失败,因此停止按钮获取到的inter始终是未定义状态。- 你尝试的外层作用域声明
const inter方案同样受const不可二次赋值的特性限制,无法正常存储定时器ID,且确实会污染全局命名空间。
解决方案
以下两种方案都不会污染全局作用域,可按需选择:
方案1:将定时器ID存储在DOM元素的data属性上(无需额外声明变量)
直接把定时器ID存在启动按钮的内置数据缓存中,不需要额外声明任何变量,完全避免作用域污染:
$(function () { $("#buttonStartTemp").click(function () { // 启动前先清除已存在的定时器,避免重复启动生成多个定时器 const existInterval = $(this).data('temp-monit-interval'); if (existInterval) clearInterval(existInterval); // 存储新的定时器ID到启动按钮的data属性中 $(this).data('temp-monit-interval', startTempMonit(onFetchCallback.store)); }); $("#buttonStopTemp").click(function () { const inter = $("#buttonStartTemp").data('temp-monit-interval'); if (inter) { clearInterval(inter); // 清除已失效的ID缓存 $("#buttonStartTemp").removeData('temp-monit-interval'); } }); }); function startTempMonit(callback) { var time = 0; const Interval = setInterval(function () { // 原有定时器业务逻辑 }, 500); return Interval; }
方案2:在ready闭包内用let声明变量(仅当前作用域有效,不污染全局)
如果你可以接受在jQuery ready的闭包范围内声明变量,只需要把原来的const改成let即可,该变量仅在当前ready函数内可访问,不会泄露到全局作用域:
$(function () { // 仅在当前ready函数作用域内有效,不会污染全局 let inter = null; $("#buttonStartTemp").click(function () { // 避免重复启动生成多个定时器 if (inter) clearInterval(inter); inter = startTempMonit(onFetchCallback.store); }); $("#buttonStopTemp").click(function () { if (inter) { clearInterval(inter); inter = null; } }); }); function startTempMonit(callback) { var time = 0; const Interval = setInterval(function () { // 原有定时器业务逻辑 }, 500); return Interval; }
内容的提问来源于stack exchange,提问作者rustyBucketBay
相关产品推荐
相关产品推荐

